结构 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# 中给出结构的额外大小 [重复]