我有两个不同的数据结构,原则上它们应该具有相同的大小,我想知道为什么它们不一样。
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;
};
然后,我将这些像素中的四个组合在一起,如下所示:
struct pix4 {
pix1 pixels[4]; // or pix2 pixels[4]
unsigned char mask;
};
...但事实证明,根据 sizeof(pix4),这种分组的大小会发生变化,这取决于我使用的是 pix1 还是 pix2。单独的 sizeof(pix1) == sizeof(pix2),所以我很困惑为什么分组四方像素会改变大小。我很在意,因为用 short 编写程序比用 2 个无符号字符更容易,但它每个像素要花费 0.25 个字节。
我不确定这个架构是否特定,因为我没有在其他类型的机器上测试过。可以对齐吗?这是我需要担心的事情,还是我可以继续进行简短的实现?
提前感谢您的帮助。
最佳答案
结构的大小相同,但对齐要求不同。
结构的对齐是其所有成员对齐的最大值。所以 pix1
有对齐 1,因为它只有字符,但是 pix2
有来自 short 成员的对齐 2。 pix4
的对齐方式然后从 pixels
成员中获取对齐方式,因此在第一种情况下为 1,在第二种情况下为 2。
现在为了确保数组的所有成员都正确对齐,结构的大小四舍五入到它对齐的下一个倍数。在这两种情况下,pixels
的大小都是 24,但是还有 1 字节的 mask
。在第一种情况下,对齐为 1,因此 25 是它的倍数,sizeof(pix4)
为 25,但在第二种情况下,对齐为 2,因此 sizeof(pix4)
> 必须四舍五入到下一个偶数 26。
这在所有平台上都是一样的。
关于c++ - Windows 64 位结构大小随包含的数据类型而变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10893600/