为什么 gcc 默认不对齐结构

问题描述 投票:0回答:1

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)) 它确实会对齐。我问为什么默认情况下不这样做。

c gcc
1个回答
0
投票

编译器足够智能,可以根据最大成员的对齐要求进行对齐。由于您只有角色成员,因此没有对齐要求。

理论上它可以决定根据目标的“基本对齐要求”插入填充来对齐,通常是

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 个填充字节。

© www.soinside.com 2019 - 2024. All rights reserved.