c/c++ 为什么函数中定义变量不会出现像 struct 中因内存对齐而导致的空间浪费

c/c++ 为什么函数中定义变量不会出现像 struct 中因内存对齐而导致的空间浪费

例如在struct

int a;
char b;
int c;

b 后面会有 3Byte 浪费的空间。
但是在函数中同样顺序定义变量 a b c 却不会出现这样的浪费。并且顺序a b c 三个变量的地址顺序和声明顺序不一样。如果这是编译器对函数中声明变量的优化的话,为什么不对 struct 的变量顺序也优化一下呢。

阅读 2.1k
1 个回答

非常有意思的问题,网上找到两个回答
第一个说函数本地变量也应该内存对齐:https://bytes.com/topic/c/ans...

第二个说本地变量对齐的代价是非常大的(在3.6.2的开头):https://www.cl.cam.ac.uk/tech...

我自己写了c语言程序

int main(void){
    struct A {
        int a;
        char b;
        int c;
    };
    struct A A1 = {4,5,6};
    int a = 1;
    char b = 2;
    int c = 3;
    return 0;
}

然后用gcc编译为汇编后的关键部分为

    movl    $4, -12(%rbp)
    movb    $5, -8(%rbp)
    movl    $6, -4(%rbp)
    movl    $1, -20(%rbp)
    movb    $2, -21(%rbp)
    movl    $3, -16(%rbp)
    movl    $0, %eax
    popq    %rbp

可以看到struct确实有内存对齐,但是内部变量之间就没有了。个人猜测函数内部变量如果能做到内存对齐那效率自然是最高的。但是这个的难度很大,因为函数内部的变量有可能不是连续的,而struct内部的东西天然就是连续的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏