2010-03-10 54 views
6

Marshal.SizeOf().的定义如下:The size returned is the size of the unmanaged object. The unmanaged and managed sizes of an object can differ.这是否意味着Marshal.SizeOf会返回您的定义大小,但不会返回实际的memeory分配的大小,因为可能有一些用于对齐的填充?C#非托管对象的大小是多少?

例如:

struct MyStruct 
{ 
    char c; 
} 

大小将是非托管对象(非托管尺寸)1个字节,如果我使用Marshal.SizeOf()也可以是用于被管理对象(管理的大小)2或4个字节,如果我使用sizeof() 。我对吗?

回答

1

只写一个小例子的应用程序。
您的示例中的MyStruct在托管和非托管情况下大小为1。
更复杂的对象的实际大小还可能取决于对齐和其他操作系统相关事物。

2

Marshal.SizeOf的唯一含义是Marshal.StructureToPtr方法所需的非托管内存块的大小。 SizeOf可能不等于托管结构大小,也可能不等于非托管结构大小。 StructureToPtr可以使用或不使用填充序列化结构,它是内部细节。 SizeOf只报告此操作需要多少内存,以及其他任何内容。