Windows 64位结构大小因包含的数据类型而异?

Cin*_*lia 4 c++ struct sizeof short

我有两个不同的数据结构,原则上应该具有相同的大小,我想知道他们为什么不这样做.

struct pix1 { 
    unsigned char r; 
    unsigned char g;
    unsigned char b; 
    unsigned char a; 
    unsigned char y[2]; 
 }; 

struct pix2 { 
    unsigned char r; 
    unsigned char g;
    unsigned char b; 
    unsigned char a; 
    unsigned short y; 
 }; 
Run Code Online (Sandbox Code Playgroud)

然后,我将这些像素中的四个组合在一起,如下:

struct pix4 {
    pix1 pixels[4]; // or pix2 pixels[4]
    unsigned char mask;
};
Run Code Online (Sandbox Code Playgroud)

...但事实证明,根据sizeof(pix4),这种分组的大小会发生变化,具体取决于我是使用pix1还是pix2.个别sizeof(pix1)== sizeof(pix2),所以我很困惑为什么分组四像素会改变大小.我关心的是因为用2个无符号字符来编写带有短路的程序比较容易,但是每个像素耗费我0.25个字节.

我不确定这个架构是否具体,因为我没有在其他类型的机器上测试过.它可以对齐吗?这是我需要担心的事情,还是我可以继续执行简短的实施?

感谢您的帮助.

Jan*_*dec 9

结构的大小是相同的,但它们的对齐要求是不同的.

结构的对齐是其所有成员的最大对齐.因此pix1,对齐1,因为它只有字符,但是pix2从短成员具有对齐2.的取向pix4然后获取从所述对准pixels部件,所以它的1在第一和2在第二种情况下.

现在,为了确保数组的所有成员都正确对齐,结构的大小将向上舍入到其对齐的下一个倍数.在这两种情况下,大小pixels都是24,但是有1个字节mask.在第一种情况下,对齐是1,因此25是它的倍数并且sizeof(pix4)是25,但是在第二种情况下,对齐是2,因此sizeof(pix4)必须向上舍入到下一个偶数,26.

在所有平台上都是一样的.