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

标签 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; 
 }; 

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

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/

相关文章:

c - 如何计算结构中数据成员的大小?

c - 分配指向结构的指针,但不是实际的结构

go - 如何在 Controller 访问的中间件中使用保存在上下文中的 "type struct"

c - sizeof(array_of_char) 输出奇怪的数字

c++ - 让openmp g++-6.2.0 没有那个文件

c++ - 简单的 OpenMP 并行 for 循环比串行计算慢

c - 如何在结构体中初始化结构体数组?

c - 对结构 C 中的数据使用 GSL 库函数

c++ - 使用 QPixMap 构建带有图像的 QGridLayout?

c++ - 为什么 Windbg 的 pdb 文件校验和失败?