在MSDN中明确规定
对于所有其他类型(包括结构),sizeof运算符只能用于不安全的代码块.
的C#语言规范是更精确的:
但是CLR如何处理以下结构:
[StructLayout(LayoutKind.Explicit, Size = 1, Pack = 1)]
public struct MyStruct
{
[FieldOffset(0)] public byte aByte;
}
public struct MyEmptyStruct { }
Run Code Online (Sandbox Code Playgroud)
在MyStruct我们明确地强制布局,大小,以及如何通过它打包StructLayout属性.该结构应该在内存中具有1个字节的大小.
另一方面MyEmptyStruct是空的,我们可以假设内存中的大小将是0字节 - 即使这样的结构很可能不会被使用它仍然是一个有趣的案例.
当尝试使用来计算论文结构的大小sizeof(MyStruct)和sizeof(MyEmptyStruct)编译器会引发以下错误:
' * '没有预定义的大小,因此sizeof只能在不安全的上下文中使用
我想知道为什么sizeof要考虑在这种情况下使用unsafe.问题不是要求解决方法,也不是要求计算结构大小的正确方法,而是要关注原因.
给定一个结构MyStruct,我可以sizeof(MyStruct)在不安全的代码中使用该结构的实例大小.但是,我想获得给定结构Type对象的结构的大小,即sizeof(typeof(MyStruct)).有Marshal.SizeOf,但是返回非托管编组大小,而我想要该结构的托管大小.
I have a struct that is defined with Pack=1 and it is 29 bytes long. If it is not packed, it would be 32 bytes long.
Marshal.SizeOf(TypeOf(StructName)) returns 29.
StructName struct; sizeof(struct) returns 32.
When I write that struct out using MemoryMappedViewAccessor it writes out 32 bytes, NOT 29 bytes.
So, short of marshalling the struct to a byte array and writing it out that way, is there any way to get it to write out that struct correctly?
More …
我想估计包含泛型类型参数的结构数组的大小,在本例中是一个字典条目结构.要做到这一点,我需要结构的大小.
struct Entry
{
int hash;
int next;
TKey key;
TValue value;
}
Run Code Online (Sandbox Code Playgroud)
如何获得此结构的字节大小?
编辑
似乎使用Marshal.SizeOf是有问题的.传递结构的类型将引发一个异常,说该参数不能是泛型类型定义.
如果我改为调用带有实例的重载,例如,Marshal.SizeOf(default(Entry))如果两个泛型类型参数都是值类型,它将起作用.如果泛型参数是例如,<int, object>则抛出此异常
无法将字典`2 + Entry [System.Int32,System.Object]'封送为非托管结构; 不能计算有意义的大小或偏移量.