结构 C# 的大小

Posted

技术标签:

【中文标题】结构 C# 的大小【英文标题】:Size of struct C# 【发布时间】:2016-03-01 07:26:31 【问题描述】:

我是 C# 新手。 我试图了解为什么结构大小会增长。 即:

struct Test

    float x;
    int y;
    char z;

Test struct 的大小实际上是 10 个字节(float=4, int=4, char=2)。 但是当我尝试使用 Marshal.SizeOf(..) 方法获取 sizeof 结构时,我得到了 12。 在 C++ 中我做了 pragma pack(1) 来防止这种情况,但我如何在 C# 中做到这一点?另一个问题: 当我尝试将测试结构转换为字节数组时,如果结构不是[Serialize],我得到大小为 12 字节的字节数组作为例外(或不是),但如果结构是[Serialize],我得到大小为170 字节,为什么会这样? 谢谢! :)

【问题讨论】:

当我尝试将 Test 结构转换为字节数组时你是怎么做的? 如果结构不是 [Serialize] 我转换是用这个方法***.com/questions/3278827/… (检查的答案),如果 soi 用***.com/questions/628843/… 转换它(最后一个答案) 请记住,如果您使用 Marshaller 或序列化 - 您不是在测量结构的大小。您正在测量非托管等效项或序列化形式的大小。两者都不一定与结构本身的大小有关。 @Damien_The_Unbeliever,我不使用 Marshal 来知道 serazlied 结构的大小。 我的意思是Marshal.SizeOf:“返回的大小是非托管类型的大小。对象的非托管和托管大小可以不同” 【参考方案1】:

这个

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct TestStruct

    float x;
    int y;
    char z;

会给出Marshal.SizeOf() == 9,因为Marshal.SizeOf(typeof(char)) == 1出于奇怪的历史原因。

但是

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]

有了这个你会得到Marshal.SizeOf() == 10

【讨论】:

谢谢,那么 [Serialize] 的大小呢 @Evyatar 您应该使用***.com/questions/3278827/… 方式,无论它是可序列化的还是不可序列化的。

以上是关于结构 C# 的大小的主要内容,如果未能解决你的问题,请参考以下文章

无法将固定大小的字节数组从结构复制到 C# 结构中的另一个数组

sizeof 运算符在 C# 中给出结构的额外大小 [重复]

如何在 C# 中构建结构列表数组(具有预定义的数组大小)

C# 数据结构,可以动态调整大小到给定限制的列表,并允许快速访问任何索引

如何编组包含未知大小的 int 数组的结构?

如何使用windbg查看C#某个线程的栈大小 ?