Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

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

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

例如在struct

int a;
char b;
int c;

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

非常有意思的问题,网上找到两个回答
第一个说函数本地变量也应该内存对齐: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内部的东西天然就是连续的


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...