2011-11-08 40 views
20

Tại sao tôi không thể sử dụng sizeof() trên các cấu trúc đơn giản?sizeof() cấu trúc không xác định. Tại sao?

ví dụ:

private struct FloatShortPair 
{ 
    public float myFloat; 
    public short myShort; 
}; 

int size = sizeof(FloatShortPair); //CS0233 

lỗi CS0233: 'FloatShortPair' không có một kích thước được xác định trước, do đó sizeof chỉ có thể được sử dụng trong một bối cảnh không an toàn (xem xét sử dụng System.Runtime.InteropServices.Marshal.SizeOf)

MSDN trạng thái:

Nhà điều hành sizeof chỉ có thể được sử dụng với nhiều loại có thời gian biên dịch hằng số. Nếu bạn gặp phải lỗi này, hãy đảm bảo rằng kích thước của số nhận dạng có thể được xác định tại thời gian biên dịch. Nếu không thể, hãy sử dụng SizeOf thay vì sizeof.

Hằng số thời gian trôi nổi và ngắn không biên dịch như thế nào? 8-/

Trả lời

23

Kích thước của shortfloat không đổi - nhưng cách CLR quyết định đóng gói phao đó trong bộ nhớ không nhất thiết phải là. Ví dụ, trên một bộ xử lý 64-bit, nó có thể quyết định sắp xếp từng giá trị trên một ranh giới 8-byte.

Từ C# 4 spec, phần 18.5.8:

Đối với các loại được xác định trước nào đó, các nhà điều hành sizeof mang lại một giá trị không đổi như thể hiện trong bảng dưới đây.

[...]

Đối với tất cả các loại khác, kết quả của các nhà điều hành sizeof là thực hiện xác định và được phân loại là một giá trị, không phải là một hằng số.

[...]

Đối với mục đích liên kết, có thể có đệm giấu tên ở phần đầu của một cấu trúc, trong một cấu trúc, và ở phần cuối của một struct.

Lưu ý rằng bạn có thể sử dụng sizeof trong tình huống này, trong một bối cảnh unsafe. Cho dù bạn nên sử dụng hoặc Marshal.SizeOf tùy thuộc vào những gì bạn đang cố gắng làm.

+1

Khi thông báo lỗi đề xuất sử dụng System.Runtime.InteropServices.Marshal.SizeOf. –

+1

Câu hỏi liên quan (xin lỗi để chiếm quyền điều khiển): Nếu bạn có quyền kiểm soát tốt hơn bố cục của loại (StructLayoutAttribute với các khoảng bù rõ ràng) có làm cho nó trở thành hằng số thời gian biên dịch không? – MattDavey

+1

@MattDavey: Không theo thông số kỹ thuật. Về cơ bản, đặc tả ngôn ngữ C# cố gắng không đưa vào các chi tiết thực hiện của những thứ như StructLayoutAttribute. –

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