谁给我解释一下,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字节对齐?

解决方案 »

  1.   

    恐怕这和C语言里的对齐是一样的。
    你前2个 Name,sex 是26,而int在32位机上是4字节,因此int的起始位置其实是在第28个字节处,因此 28+4 = 32。如果你把sex=6,加上int i后,长度还是32,因此26通27一样下一个对齐的位置在28。
      

  2.   

    我还是不太明白
    第一个name是占21 ,第二个sex按4字节对齐就应该是从25字节开始啊而且我还试了,如果把int i放到name和sex前面,则是32,又是对着了.
      

  3.   

    不是每个变量都是按4字节的。是按他们本身的长度来对齐的。
    int 4
    long 4
    byte 1
    short 2
    char 1string 其实就是char*因此它是按 1 对齐。
      

  4.   

    你把 int i放在前面。
    后面的 name,sex 当然就按顺序放,因此长度也是对的了。