大小效用的奇怪行为
Strange behaviour of size utility
第一种情况:
#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
第三种情况:
#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
这是正确的
为什么第二种情况的输出不正确?
您可能正在针对 64 位架构进行编译,其中内存对齐到 8 字节(64 位)。
一个像第一个例子中的程序一样简单的程序有一个 4 字节的起始 bss,但是为了对齐目的分配了 8 个字节,所以当你声明 global 变量时, 你填满了左边的 4 个字节。
声明另一个 4 字节的变量将向 bss 添加 8 个字节,直到它也被填满,依此类推。
第一种情况:
#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
第三种情况:
#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
这是正确的
为什么第二种情况的输出不正确?
您可能正在针对 64 位架构进行编译,其中内存对齐到 8 字节(64 位)。
一个像第一个例子中的程序一样简单的程序有一个 4 字节的起始 bss,但是为了对齐目的分配了 8 个字节,所以当你声明 global 变量时, 你填满了左边的 4 个字节。
声明另一个 4 字节的变量将向 bss 添加 8 个字节,直到它也被填满,依此类推。