大小实用程序的奇怪行为

时间:2016-03-05 09:25:41

标签: c linux data-segment

第一案:

#include <stdio.h>

int main(void)
{
    return 0;
}

尺寸输出:

text       data     bss     dec     hex filename

1115        552       8    1675     68b ./a.out

第二案:

#include <stdio.h>

int global;  // new line compared to previous case

int main(void)
{
    return 0;
}

尺寸输出:

text       data     bss     dec     hex filename
1115        552       8    1675     68b ./a.out

理想情况下应该是:

bss=12 and all other (text and data) same

第3例:

#include <stdio.h>

int global;

int main(void)
{
    static int i;  // new line compared to previous case
    return 0;
}

尺寸输出:

text       data     bss     dec     hex filename
1115        552      16    1683     693 ./a.out

这是正确的

为什么第二种情况下的输出不正确?

1 个答案:

答案 0 :(得分:2)

你可能正在为64位架构进行编译,你可以将内存对齐到8个字节(64位)。

像第一种情况一样简单的程序有一个4字节的起始bss,但是为了对齐目的分配了8个字节,所以当你声明全局变量时,你填满了留下4个字节。

声明另一个4字节变量将向bss添加8个字节,直到它也被填充,依此类推。