Tại sao GHC's Int type
không đảm bảo sử dụng chính xác 32 bit chính xác? This document claim có ít nhất độ chính xác được ký 30 bit. Có phải nó liên quan đến việc lắp Maybe Int
hoặc tương tự vào 32 bit không?Kích thước bit của GHC's Int Type
Trả lời
Nó cho phép triển khai Haskell sử dụng gắn thẻ. Khi sử dụng gắn thẻ, bạn cần một vài bit làm thẻ (ít nhất một, hai thẻ là tốt hơn). Tôi không chắc chắn hiện tại có bất kỳ triển khai như vậy, nhưng tôi dường như nhớ Yale Haskell sử dụng nó.
Gắn thẻ phần nào có thể tránh được những bất lợi của quyền anh, vì bạn không còn phải đóng hộp tất cả mọi thứ; thay vào đó, bit thẻ sẽ cho bạn biết nếu nó được đánh giá, v.v.
Bạn có thể giải thích" gắn thẻ "và" quyền anh "không? –
Tôi nghĩ điều này là do những cách sớm để triển khai GC và tất cả nội dung đó. Nếu bạn có 32 bit có sẵn và bạn chỉ cần 30 bit, bạn có thể sử dụng hai bit dự phòng đó để thực hiện những điều thú vị, ví dụ bằng cách sử dụng số không trong bit ít quan trọng nhất để biểu thị một giá trị và một cho con trỏ.
Hôm nay, việc triển khai không sử dụng các bit đó để Int
có ít nhất 32 bit trên GHC. (Điều đó không hoàn toàn đúng. IIRC người ta có thể đặt một số cờ để có 30 hoặc 31 bit Int
s)
Định nghĩa ngôn ngữ Haskell nêu rõ rằng type Int
covers at least the range [−229, 229−1]. Có các trình biên dịch/phiên dịch khác sử dụng thuộc tính này để tăng thời gian thực hiện của chương trình kết quả.
Tất cả các tham chiếu bên trong tới (căn chỉnh) Điểm dữ liệu Haskell đến địa chỉ bộ nhớ là bội số của 4 (8) trên hệ thống 32 bit (64 bit). Vì vậy, tài liệu tham khảo chỉ cần 30bits (61bits) và do đó cho phép 2 (3) bit cho "con trỏ gắn thẻ".
Trong trường hợp dữ liệu, GHC sử dụng các thẻ đó để lưu trữ thông tin về dữ liệu được tham chiếu đó, tức là giá trị đó đã được đánh giá chưa và nếu có thì hàm tạo.
Trong trường hợp 30-bit Int
s (do đó, không phải GHC), bạn có thể sử dụng một bit để quyết định xem đó có phải là con trỏ tới số Int
không được đánh giá hay chính nó là Int
.
Gắn thẻ con trỏ có thể được sử dụng cho tính tham chiếu một bit, có thể tăng tốc quá trình thu thập rác. Điều đó có thể hữu ích trong trường hợp mối quan hệ giữa người tiêu dùng và nhà sản xuất trực tiếp được tạo ra trong thời gian chạy: Nó sẽ dẫn đến việc sử dụng lại bộ nhớ thay vì sử dụng bộ thu gom rác.
Vì vậy, sử dụng 2 bit cho gắn thẻ con trỏ, có thể có một số sự kết hợp tự nhiên của tối ưu hóa dữ dội ... Trong trường hợp Ints tôi có thể tưởng tượng những 4 thẻ:
- một tài liệu tham khảo đặc biệt đến một unevaluated
Int
- một trong nhiều tài liệu tham khảo để cùng có thể vẫn unevaluated
Int
- 30 bit mà
Int
tự - một tài liệu tham khảo (các thể nhiều tài liệu tham khảo) để được đánh giá là 32 bit
Int
.
- 1. 32 bit int * 32 bit int = 64 bit int?
- 2. Kích thước tối đa của int (10) trong Mysql
- 3. Kích thước của cấu trúc trên 32 bit và 64 bit
- 4. Tìm hiểu kích thước đối tượng CLR giữa 32 bit so với 64 bit
- 5. Kích thước của #define giá trị
- 6. Kích thước bit dài trên Windows 64 bit là bao nhiêu?
- 7. Kích thước bộ nhớ của một hệ thống 32 bit int_] mảng
- 8. C++ Kích thước của mảng
- 9. Con trỏ C++ có kích thước bit cụ thể
- 10. Tại sao loại trường bit ảnh hưởng đến kích thước của cấu trúc chứa?
- 11. Tốc độ bit và kích thước tệp video
- 12. Kích thước của GLSL boolean
- 13. Kích thước của chuỗi
- 14. Kích thước của MessageBox
- 15. Dung lượng "bit dữ liệu" so với kích thước "overhead bit"?
- 16. Lấy kích thước của các kích thước trong mảng
- 17. Tại sao kích thước của kiểu dữ liệu bool chỉ bằng 1 bit trong C#?
- 18. C++/Kích thước của một vector 2d
- 19. kích thước của mảng và kích thước của con trỏ nhân vật nhân vật
- 20. Kích thước của một Nullable <Int32> là gì?
- 21. Tính toán kích thước của một mảng
- 22. kích thước của kiểu char trong C
- 23. Độ dài của các bit được sử dụng trong int
- 24. kích thước của struct trong C
- 25. Kích thước tệp tối đa của hình ảnh JPEG có kích thước đã biết
- 26. Kích thước của một NSArray
- 27. Giảm kích thước của .rodata
- 28. lấy kích thước của nswindow
- 29. Kích thước của ViewPager Android
- 30. Kích thước VARCHAR của MySQL?
Sẽ có những người khác có nhiều chi tiết hơn, nhưng tôi nghĩ rằng nó phải liên quan đến thu gom rác và lười biếng.Một chút cho "được đánh giá", một chút để sao chép bằng GC. Không chắc chắn 100% mặc dù. – luqui
Nếu bạn cần bảo đảm 32 bit, có loại 'Int32' trong' Data.Int'. – hammar
Không có giới hạn trên bởi vì nó phụ thuộc vào nền tảng: trên máy 64x 'Prelude.maxBound :: Int' phải ở khoảng 2^63 –