为什么Marshal.SizeOf()把struct的大小凑成了偶数?

idiotzeng 2002-10-08 12:23:29
struct定义如下
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
internal struct DllInvoices
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=8)]
public byte[] serial;
public byte Type;
public uint Sum;
}
调用Marshal.Size得到的大小为9

添加一个字段Sum:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
internal struct DllInvoices
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=8)]
public byte[] serial;
public byte Type;
public uint Sum;
}
调用Marshal.Size得到的大小为16,为什么不是13?
...全文
101 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqchen79 2002-10-09
  • 打赏
  • 举报
回复
可以通过StructLayout的Pack属性改变这种对齐设置——如果有必要的话:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi,Pack=1)]
结果就是13了。
idiotzeng 2002-10-08
  • 打赏
  • 举报
回复
写错了,更改一下:P
struct定义如下
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
internal struct DllInvoices
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=8)]
public byte[] serial;
public byte Type;
}
调用Marshal.Size得到的大小为9

添加一个字段Sum:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
internal struct DllInvoices
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=8)]
public byte[] serial;
public byte Type;
public uint Sum;
}
调用Marshal.Size得到的大小为16,为什么不是13?
qqchen79 2002-10-08
  • 打赏
  • 举报
回复
这其实是体系结构和汇编的问题。
在内存里特定类型数据的起始地址通常有一定的对齐要求,比如说32位机器上的int起始地址必须是4的整数倍,结构通常也是如此。
如果一个结构包含一个char和一个int,那么char作为结构体的第一个字段,需要在4的整数倍地址开始,而int有同样的要求,所以char之后必须空出3个字节来,才能使int的地址满足对齐的要求。

.NET的CLR是基于32位的,所以也由上述要求。在你的byte之后,必须空出3个字节。所以结果就是16个字节了。
cometsky 2002-10-08
  • 打赏
  • 举报
回复
猜测:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
是不是与你这一句中的CharSet=CharSet.Ansi有关。
idiotzeng 2002-10-08
  • 打赏
  • 举报
回复
再顶
idiotzeng 2002-10-08
  • 打赏
  • 举报
回复
up一下

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧