gpt4 book ai didi

c++ - Windows 64 位结构大小随包含的数据类型而变化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:48 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com