AFAIK,编译器应该默认对齐结构。
那为什么 gcc 不这么做呢?
#include <stdio.h>
typedef struct {
unsigned char r, g, b;
} color_t;
int main() {
printf("size of color_t: %lu\n", sizeof(color_t));
}
$ gcc test.c -o test
$ ./test
size of color_t: 3
$ gcc --version
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
注意:如果我使用 __attribute__((aligned)) 它确实会对齐。我问为什么默认情况下不这样做。
编译器足够智能,可以根据最大成员的对齐要求进行对齐。由于您只有角色成员,因此没有对齐要求。
理论上它可以决定根据目标的“基本对齐要求”插入填充来对齐,通常是
sizeof(int)
,但它没有有。
如果我们像这样修改代码:
typedef struct {
unsigned short dummy;
unsigned char r, g, b;
} color_t;
假设
dummy
的对齐要求为2,那么编译器很可能会在末尾添加一个填充字节,总大小为6,这样结构体数组就不会以dummy
未对齐的方式结束。然而,它可以使用更大的对齐方式,但如果需要的话,这取决于编译器。
例如,如果我修改上面的示例以使用
uint_fast16_t dummy;
告诉编译器我想要速度超过大小,那么在 x86_64 上我得到的结构大小为 16,因为 8 字节的字大小被认为是最快的。 dummy
之后将有 6 个填充字节,r、g、b 之后还有 5 个填充字节。