Khi thực hiện P/Gọi, điều quan trọng là phải thực hiện đối sánh bố cục dữ liệu.Kích thước và sự liên kết của mảng bool cố định C# trong cấu trúc là gì?
Chúng tôi có thể kiểm soát bố cục của cấu trúc bằng cách sử dụng một số thuộc tính.
Ví dụ:
struct MyStruct
{
public bool f;
}
đưa ra một kích thước của 4. Trong khi chúng ta có thể nói với trình biên dịch để làm cho nó một bool 1 byte để phù hợp với C++ loại bool
:
struct MyStruct
{
[MarshalAs(UnmanagedType.I1)]
public bool f;
}
đưa ra một kích thước của 1.
Điều này có ý nghĩa. Nhưng khi tôi kiểm tra mảng bool cố định, tôi đã bối rối.
unsafe struct MyStruct
{
public fixed bool fs[1];
}
cho kích thước 4 byte. và
unsafe struct MyStruct
{
public fixed bool fs[4];
}
vẫn cho kích thước 4 byte. nhưng
unsafe struct MyStruct
{
public fixed bool fs[5];
}
đưa ra một kích thước của 8.
Dường như trong mảng bool cố định, kích thước của nguyên tố bool vẫn là 1 byte, nhưng sự liên kết là 4 byte. Điều này không phù hợp với mảng C++ bool, mà là 1 byte kích thước và liên kết.
Ai đó có thể giải thích cho tôi về điều này không?
Cập nhật: Cuối cùng tôi tìm ra, lý do là, loại bool trong cấu trúc, thì cấu trúc đó sẽ KHÔNG BAO GIỜ được blittable! Vì vậy, không mong đợi một cấu trúc có kiểu bool bên trong để được bố trí giống như trong C.
Trân trọng, Xiang.
'bool _f tư nhân; '->' byte _f tư nhân; '? – PetSerAl
Vui vì tôi đã giải thích rõ :) Cảm ơn. –
Cảm ơn, đó là một lời giải thích rất chi tiết. Mặc dù tôi hiểu một thuộc tính trong C++ có thể là một giải pháp mạnh mẽ, nhưng tôi vẫn muốn biết lý do tại sao trong mảng bool cố định C#, nó hoạt động rất lạ, trông giống như kích thước của nó là 1 byte, nhưng liên kết của nó là 4 byte. Bạn có biết những gì ma thuật là đằng sau C# marshaling trên mảng bool cố định nhúng trong cấu trúc? –