C#含单个字段的结构体与字段类型在非托管内存是否等价及Marshal兼容?
单个字段的C#非托管结构体与字段类型的非托管内存等价性问题
内存布局等价性
对于你定义的泛型结构体:
public struct MyStruct<T> where T: unmanaged { public T pointer; }
在非托管内存中,它的布局完全等价于独立的T类型。原因如下:
- 结构体的
unmanaged约束确保T本身是非托管类型,单个字段的结构体不会产生额外的内存填充或布局开销(C#编译器和CLR会保证这一点,因为没有其他字段需要对齐调整)。 Marshal.SizeOf(MyStruct<T>)的返回值与Marshal.SizeOf<T>()完全一致,这也验证了二者内存大小的等价性。
Marshal方法的表现一致性
你提供的代码可以正常运行,Marshal.StructureToPtr和Marshal.PtrToStructure的表现完全一致。
代码执行逻辑说明:
- 分配的非托管内存大小等于
MyStruct<int>(即int类型)的大小。 Marshal.StructureToPtr将MyStruct<int>实例的内容写入非托管内存,本质就是写入其中的int字段值。Marshal.PtrToStructure<int>从同一块内存读取时,能正确解析出对应的int值,和直接写入的结构体字段值一致。
需要注意的细节:
- 必须保证
T始终满足unmanaged约束,避免引入托管类型破坏布局等价性。 - 如果给结构体添加了自定义布局属性(如
[StructLayout]),需确保布局设置与T的默认布局一致,否则可能打破等价关系。
内容的提问来源于stack exchange,提问作者Shanoa Ice
相关产品推荐
相关产品推荐

