2010-09-27 39 views
9

Có phải là 12 byte hoặc 16 byte khi được lưu trữ trong một List<DataPoint> không?Kích thước của cấu trúc C# này là gì?

public struct DataPoint 
{ 
    DateTime time_utc; 
    float value; 
} 

Có chức năng sizeof nào trong C# không?

+0

Tôi hy vọng bạn biết rằng mỗi trường hợp cấu trúc này sẽ được đóng hộp khi đưa vào danh sách, vì vậy hãy thêm không gian cho con trỏ. –

+6

@ToxicAvenger: nó sẽ * không * được đóng hộp khi bạn đặt nó bên trong một 'Danh sách '. Nó sẽ được đóng hộp trong một 'ArrayList' hoặc' List 'mặc dù. – Ruben

+0

Điều này cụ thể hơn, nhưng có thể là bản sao của http://stackoverflow.com/questions/3361986/how-to-check-the-number-of-bytes-consumed-by-my-strucure –

Trả lời

14

Hãy xem câu trả lời của @Hans Passant here để biết thông tin thú vị về vấn đề này, đặc biệt là liên quan đến các giới hạn của Marshal.Sizeof.

+8

Có, câu trả lời tốt :) –

8
+1

Bạn có thể thêm giải pháp cho câu hỏi của mình: 16 byte (8 byte + 4 byte + 4 byte căn chỉnh) – Scoregraphic

+3

Nguyên soái.SizeOf() không * trả về kích thước của một cấu trúc được quản lý, chỉ có phiên bản không được quản lý của nó. Kiểm tra câu trả lời của Steve. –

0

Hãy thử Marshal.SizeOf (typeof (Datapoint))

2

Nó sẽ là 12 byte (4 cho float, 8 cho DateTime); Marshal.SizeOf sẽ trả về 16 vì đóng gói mặc định là 8 byte được căn chỉnh. This là một bài viết hay về cấu trúc và bao bì. Nó đưa ra một mô tả đầy đủ về những gì đang thực sự xảy ra.

6

CLR là miễn phí để bố trí các loại trong bộ nhớ khi nó phù hợp. Vì vậy, nó không thể trực tiếp cung cấp cho "kích thước".

Tuy nhiên, đối với các cấu trúc nó có thể hạn chế sự tự do của CLR sử dụng StructLayout Attribute:

  • Auto: Thời gian chạy tự động chọn một bố trí thích hợp.
  • Tuần tự: Các thành viên của đối tượng được trình bày tuần tự và được căn chỉnh theo giá trị StructLayoutAttribute.Pack.
  • Rõ ràng: Vị trí chính xác của từng thành viên được kiểm soát rõ ràng.

Trình biên dịch C# tự động áp dụng loại bố cục tuần tự cho bất kỳ cấu trúc nào. Giá trị Gói mặc định là 4 hoặc 8 trên máy x86 hoặc x64 tương ứng. Vì vậy, kích thước của cấu trúc của bạn là 8 + 4 = 12 (cả x86 và x64).


Không liên quan từ làm thế nào một loại được đặt ra trong bộ nhớ, nó cũng có thể sắp xếp một loại trong NET sử dụng Marshal Class. Trình soạn thảo này áp dụng một số phép biến đổi khi marshalling một kiểu, do đó kết quả không phải lúc nào cũng giống như cách CLR đặt ra loại đó. (Ví dụ: bool mất 1 byte trong bộ nhớ cộng với căn chỉnh, trong khi marshaller marshals là bool đến 4 byte.)

+0

Lưu ý rằng có thể với lệnh '' sizeof' của IL để lấy kích thước CLR "cuối cùng" của một cấu trúc, có tính đến phần đệm tài khoản và bất kỳ thao tác căn chỉnh nào khác. Xem [bài đăng trên blog của tôi] (http://lastyearswishes.com/blog/view/50a30d3bd1f1a5234323b198) để biết cách sử dụng và nhiều khác biệt hơn (lưu ý: Tôi đã viết một thư viện trình bao bọc có thể được gọi từ C#) – Earlz

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