谁给我解释一下,c#中字节对齐的机制
//[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi,Pack = 4)]
public struct testStru
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21)]
public string Name; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string sex; //public int i;
}
为什么 ,我加上public int i 后 ,size 就为32 ,而不加这句 size 就为26,
我认为因为默认的pack是4,也就是按4字节对齐,那么如果不加int i 的话,size应该为28才对啊?怎么加上int 后才按4字节对齐?
//[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi,Pack = 4)]
public struct testStru
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21)]
public string Name; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string sex; //public int i;
}
为什么 ,我加上public int i 后 ,size 就为32 ,而不加这句 size 就为26,
我认为因为默认的pack是4,也就是按4字节对齐,那么如果不加int i 的话,size应该为28才对啊?怎么加上int 后才按4字节对齐?
你前2个 Name,sex 是26,而int在32位机上是4字节,因此int的起始位置其实是在第28个字节处,因此 28+4 = 32。如果你把sex=6,加上int i后,长度还是32,因此26通27一样下一个对齐的位置在28。
第一个name是占21 ,第二个sex按4字节对齐就应该是从25字节开始啊而且我还试了,如果把int i放到name和sex前面,则是32,又是对着了.
int 4
long 4
byte 1
short 2
char 1string 其实就是char*因此它是按 1 对齐。
后面的 name,sex 当然就按顺序放,因此长度也是对的了。