结构的大小似乎不正确?

Size of a struct seemingly incorrect?

我在 C 中声明了这个结构。当我调用 sizeof(struct pixel) 时,我被告知这个结构的大小是 12 字节,而我期望它是 7 字节(1 用于字符,4 用于诠释)。为什么会这样?

结构:

   struct pixel {
        unsigned char red;
        unsigned char green;
        unsigned int alpha;
        unsigned char blue;
    };

想法是出于速度和缓存方面的考虑,应该从与其自然大小对齐的地址读取操作数。

struct pixel {
    unsigned char red;   // 0
    unsigned char green; // 1
    unsigned int alpha;  // 4 (gotta skip to an aligned offset)
    unsigned char blue;  // 8 (then skip 9 10 11)
};

// next offset: 12

x86 架构始终能够获取未对齐的地址。但是,它的速度较慢,并且当未对齐重叠两个不同的缓存行时,它会驱逐两个缓存行,而对齐的访问只会驱逐一个缓存行。

有些架构实际上必须捕获未对齐的读写,以及 ARM 架构的早期版本(演化为当今所有移动 CPU 的架构)......好吧,它们实际上只是为那些返回了错误的数据.

所以,对齐很重要。

在 C 中,结构成员对齐以实现更快更安全的内存访问。您的默认对齐方式是 4,因此在 redgreen 之后跟随 2 个填充字节(4 字节块完整),然后是 alpha 有 4 个字节,最后一个字节 blue 被填充为再次变成 4 个字节 -> 3x 4 字节 = 12 个字节。

您可以通过 pragma pack.

等编译器指令更改此行为

正如其他几个用户所指,是填充问题。参见 this
我认为你可以减少这个结构的 less 是 8 个字节(在 x86 处理器中),要么将 alpha 字段放在 beginning 或 end