Marshal.SizeOf();取结构体大小

OrdinaryCoder 2019-04-29 10:49:58

public struct Test
{
public int x;
public int y;
}

长度是8

public struct Test
{
public int x;
public int y;
public byte b;
}

长度是12

public struct Test
{
public int x;
public int y;
public long l;
}

长度是16

public struct Test
{
public int x;
public int y;
public long l;
public byte b;
}

长度24

结构的长度是里面最大长度类型的n倍 比如最大长度类型是long 那么结构的长度就是 8 16 24.. 按字节算这个结构可能是13 那么这个结构的长度就是16 以此类推
另外 Marshal.SizeOf()取char的长度是1(非托管代码中如C++ char是一个字节),用sizeof取char(C#中)长度是2
...全文
600 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jx315425246 2019-05-01
  • 打赏
  • 举报
回复
8,9,16,24 内存是不对齐的,不然发送一个结构,就能解析了,
stherix 2019-04-29
  • 打赏
  • 举报
回复
引用 3 楼 OrdinaryCoder 的回复:
[quote=引用 2 楼 stherix 的回复:] 结构体有个Attribute [StructLayout(LayoutKind.Sequential, Pack = 1)] 这样可以让结构体以紧凑格式存储 否则按4字节对齐(x86下)
我测试如果有long的话是按照8个字节对其,这个好像是和结构中最大长度的类型有关,如果最大长度类型是short 我测试是按照2个字节对齐的 另外谢谢这个节凑 格式储存 又学到了新知识[/quote] 这个和c++一样的 c++也要用 #pragma pack(1) 来用紧凑格式 因为按 字 对齐 而非 字节 对齐的方式 有利于CPU指令快速存取,但是空间利用率会低一些
OrdinaryCoder 2019-04-29
  • 打赏
  • 举报
回复
引用 2 楼 stherix 的回复:
结构体有个Attribute
[StructLayout(LayoutKind.Sequential, Pack = 1)]
这样可以让结构体以紧凑格式存储
否则按4字节对齐(x86下)

我测试如果有long的话是按照8个字节对其,这个好像是和结构中最大长度的类型有关,如果最大长度类型是short 我测试是按照2个字节对齐的 另外谢谢这个节凑 格式储存 又学到了新知识
stherix 2019-04-29
  • 打赏
  • 举报
回复
结构体有个Attribute [StructLayout(LayoutKind.Sequential, Pack = 1)] 这样可以让结构体以紧凑格式存储 否则按4字节对齐(x86下)
OrdinaryCoder 2019-04-29
  • 打赏
  • 举报
回复
我之前一直以为在结构体中 一个int+一个byte是5个字节

111,093

社区成员

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

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

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