C 中的结构填充优化

she*_*hea 0 c gcc struct sizeof

#include <stdio.h>

struct X
{
    short s; 
    int i; 
    char c;
};

struct Y
{
    int i;
    char c;
    short s;
};

struct Z
{
    int   i;
    short s;
    char  c;
};

int main() {
    printf("%lu %lu %lu\n", sizeof(struct X), sizeof(struct Y), sizeof(struct Z));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码返回

12 8 8
Run Code Online (Sandbox Code Playgroud)

证明结构体的大小取决于声明其成员的顺序。是否有任何编译器设置可以对这些声明进行最佳重新排序(以获得最小结构大小)?随着项目规模的扩大,确保最佳填充的一些一般实践规则是什么?

Joh*_*ger 6

是否有任何编译器设置可以对这些声明进行最佳重新排序(以获得最小结构大小)?

不会。C 允许程序依赖结构成员顺序并对结构成员顺序敏感。编译器不能随意重新排序结构成员。

确保最佳对齐的一些一般实践规则是什么

一般来说,您可以通过降低对齐要求来对成员进行排序,从而最大限度地减少结构布局中的填充。

许多编译器还提供扩展,使您能够减少或消除结构填充,但可能会因对成员的访问不对齐而降低性能。然而,这些扩展不能跨编译器移植,并且在未对齐的访问会产生硬错误而不仅仅是性能损失的平台上,它们没有实际意义。

  • 关于“*C 允许程序依赖结构成员顺序并对结构成员顺序敏感。*”,这允许扩展结构,同时保留 ABI 中的向后兼容性。/// 这也允许创建具有共同起点的不同结构,例如多态性。 (2认同)