2013-07-19 81 views
22

Tôi chỉ đang học C# và tìm hiểu sâu hơn về các loại dữ liệu.Tại sao kích thước của kiểu dữ liệu bool chỉ bằng 1 bit trong C#?

Tại sao không phải là kích thướcloại dữ liệu 1 bit?

Dường như nó chỉ có thể giữ một trong hai giá trị (đúng hoặc sai), vì vậy sẽ không chỉ mất 1 chút không gian để biểu thị giá trị đó?

Có phải vì kích thước 'địa chỉ' nhỏ nhất của một giá trị là một byte (8 bit) như được đề cập trong this post?

Mục tiêu tổng thể của tôi là hình dung một cách hợp lý kích thước khác nhau của từng loại dữ liệu trong C# vì vậy tôi đang cố gắng tạo danh sách tất cả các kiểu dữ liệu và kích thước bit được phân bổ của chúng.

+0

[This] (http://stackoverflow.com/a/2308052/1324033) có thể giúp bạn – Sayse

+0

Có thể trùng lặp của [Tại sao trong .NET System.Boolean mất 4 byte?] (Https: // stackoverflow .com/questions/294905/why-in-net-system-boolean-take-4-byte) –

+0

Câu hỏi này được hỏi 4 năm trước và có một số câu trả lời có giá trị, nó sẽ là một điều đáng tiếc nếu nó đã được gỡ bỏ như là một bản sao. – user1063287

Trả lời

23

Có phải vì kích thước nhỏ nhất 'địa chỉ' của một giá trị là một byte

Yep, chính xác những điều tương tự . Để CLR có hiệu quả, nó ánh xạ các kiểu dữ liệu của nó tới các kiểu dữ liệu máy bản địa theo cách tương tự như trình biên dịch thực hiện trong C++ (khá nhiều).

+0

Và nó không làm bất kỳ bao bì, bao giờ - vì vậy sử dụng 8 bools * có thể * được đại diện như một byte đơn; nhưng không bao giờ. Pascal là một ví dụ về một ngôn ngữ không xử lý nó cho bạn, nhưng .NET chắc chắn không làm điều đó. – Luaan

3

Nếu bạn muốn lưu trữ nhiều cờ theo cách không gian hiệu quả, hãy xem xét sử dụng Int32 hoặc Int64 làm bitmap, theo cách này bạn có thể lưu 32 hoặc 64 cờ boolean trong kiểu dữ liệu 32/64 bit. Bạn phải thực hiện các kiểm tra bitmask để kiểm tra hoặc thiết lập các giá trị, do đó, có một chi phí bổ sung nhỏ để truy cập hoặc cập nhật, qua biến Boolean.

Kích thước của trường Boolean trong bộ nhớ là 1 byte và của biến Boolean là 4 byte.

BitArray cũng rất thuận tiện để đối phó với rất nhiều cờ bit: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

+0

Bạn đang tìm kích thước của biến Boolean là 4 byte ở đâu? – Tyler

+1

@Tyler http://stackoverflow.com/questions/294905/why-in-net-system-boolean-takes-4-byte –

+0

Bạn nên nói tối đa 4 byte sau đó vì nó có thể không thực sự kết thúc chiếm 4 byte. – Tyler

1

Tôi cũng nhận thấy điều này ... Tôi đã tạo hai mảng: float [4000] và float? [4000]. Mảng thứ hai mất gấp đôi không gian bộ nhớ vì phao? được thực hiện như một phao và một bool, và bool kết thúc bằng việc lấy 32 bit giống như float. Vì vậy, cuối cùng, nếu sử dụng bộ nhớ là một mối quan ngại, việc sử dụng giá trị float NaN để biểu diễn "null" trong phao [] tốt hơn là sử dụng một phao [?].

Làm cho tôi cảm thấy như một thằng ngốc trong nhiều năm tôi đã cố gắng sử dụng các loại dữ liệu nhỏ hơn tin rằng nó thực sự đang hoạt động tốt! :-)

Các vấn đề liên quan