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
...全文
296 点赞 收藏 5
写回复
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个字节
回复
相关推荐
发帖
C#
创建于2007-09-28

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2019-04-29 10:49
社区公告

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