2010-08-24 37 views
11

Vì vậy, một vài câu hỏi, trên thực tế:Kích thước của một Nullable <Int32> là gì?

  1. Một int (Int32) được quy định để được (rõ ràng) 32 bit. Còn một số int? (Nullable<int>) thì sao? Ruột của tôi nói với tôi rằng nó sẽ là 32 bit cho số nguyên cộng với 8 bit hơn cho boolean, nhưng có lẽ việc thực hiện phức tạp hơn thế.
  2. Tôi đã trả lời câu hỏi của riêng mình bằng cách sử dụng sizeof(int?); nhưng dưới dạng int? là loại được quản lý, điều này không được phép. Tôi hiểu rằng kích thước của một loại có thể phụ thuộc vào nền tảng và trong trường hợp đối tượng chứa tham chiếu đến các đối tượng khác, thao tác giống như sizeof sẽ gây hiểu lầm. Tuy nhiên, có cách nào để có được kích thước "đường cơ sở" (tức là kích thước của một thể hiện mới được tạo ra) sẽ là một kiểu được quản lý, cho môi trường hiện tại không?
+0

bản sao có thể có của [Dấu chân bộ nhớ của một Nullable ] là gì (http://stackoverflow.com/questions/1381308/what-is-the-memory-footprint-of-a-nullablet) –

Trả lời

6

Bạn có thể xem trong ildasm hoặc Reflector.

Nếu có hai trường: boolT, vì vậy có thể 8 byte (giả định 4 byte căn chỉnh).

+0

Tốt, đã học một cái gì đó mới với cái này!Nó hoàn toàn có ý nghĩa, nhưng tôi đã không coi vấn đề liên kết (tôi đoán đó là những gì sẽ xảy ra khi bạn nhập phát triển phần mềm vào cuối trò chơi, không có giáo dục CS). –

0

Cân nhắc phương pháp Marshal.SizeOf. Nó cho phép để có được kích thước của các loại giá trị được quản lý. Nó là lạ, nhưng trông giống như kích thước của loại nullable bằng với kích thước của tham số kiểu của họ (kích thước của int? Bằng với kích thước của int, vv)

+1

AFAIK bạn không thể sắp xếp một giá trị nullable. Vì vậy, bạn đang nhận được dữ liệu không chính xác. –

+2

Tài liệu của Microsoft cho biết: "Kích thước không được quản lý và được quản lý của một đối tượng có thể khác nhau". - vì vậy phương pháp này không đáng tin cậy. – MarkusSchaber

2

Tôi tìm thấy một điều trị chính xác câu hỏi này here, bao gồm mã cho một ứng dụng giao diện điều khiển đơn giản để kiểm tra việc sử dụng bộ nhớ.

Về cơ bản,

... Điều này cho thấy rằng các loại nullable wrapper đòi hỏi 4 byte dung lượng lưu trữ ...

6

Nó là khá quan trọng để không bao giờ hỏi một câu hỏi như thế này bởi vì bạn sẽ không nhận được một câu trả lời thẳng.

Nhưng vì bạn vẫn làm như vậy: kích thước tối thiểu là 0 byte. Mà bạn sẽ nhận được khi trình tối ưu hóa JIT quản lý để giữ giá trị trong thanh ghi CPU. Kích thước tiếp theo là 2 byte, cho bool? và byte ?, 1 byte cho HasValue, một byte khác cho giá trị. Mà bạn sẽ hiếm khi nhận được bởi vì các biến địa phương phải được liên kết với một địa chỉ đó là bội số của 4. Thêm 2 byte đệm chỉ đơn giản là sẽ không bao giờ được sử dụng.

Kích thước tiếp theo là 3 cho ngắn? và char ?, bây giờ bạn sẽ nhận được 1 byte đệm.

Bước nhảy vọt lớn tới phiên bản tiếp theo, int? yêu cầu 5 byte nhưng phần đệm tăng lên đến 8.

Etcetera. Bạn tìm thấy điều này bằng cách viết một đoạn mã như sau:

 int front = 42; 
     bool? center = null; 
     int back = 43; 
     Console.WriteLine("", front, center, back); 

Và xem hướng dẫn mã máy với trình gỡ rối. Lưu ý bù trừ đăng ký ebp. Và hãy cẩn thận rằng ngăn xếp phát triển.

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