【问题标题】:Size of struct C#结构 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] 我转换是用这个方法stackoverflow.com/questions/3278827/… (检查的答案),如果 soi 用stackoverflow.com/questions/628843/… 转换它(最后一个答案)
  • 请记住,如果您使用 Marshaller 或序列化 - 您不是在测量结构的大小。您正在测量非托管等效项或序列化形式的大小。两者都不一定与结构本身的大小有关。
  • @Damien_The_Unbeliever,我不使用 Marshal 来知道 serazlied 结构的大小。
  • 我的意思是Marshal.SizeOf:“返回的大小是非托管类型的大小。对象的非托管和托管大小可以不同”

标签: c# struct


【解决方案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

【讨论】:

猜你喜欢
  • 2015-02-17
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 2010-12-22
  • 2016-08-30
相关资源
最近更新 更多