【发布时间】:2015-05-31 02:32:02
【问题描述】:
我收到来自size 命令的意外输出。
Afaik 初始化了存储在 data 段中的全局和静态变量,未初始化并初始化为 0 存储在 bss 段中的全局/静态变量。
printf("%d",sizeof(int)); 将 int 的大小设为 4。但是,bss 和 data 段并没有相应地增加到 4。
#include <stdio.h>
int main()
{
return 0;
}
C:\Program Files (x86)\Dev-Cpp\MinGW64\bin>size memory-layout.exe
text data bss dec hex filename
10044 2292 2512 14848 3a00 memory-layout.exe
#include <stdio.h>
int g; //uninitialised global variable so, stored in bss segment
int main()
{
return 0;
}
C:\Program Files (x86)\Dev-Cpp\MinGW64\bin>size memory-layout.exe
text data bss dec hex filename
10044 2292 2528 14864 3a10 memory-layout.exe
为什么bss 增加了 16 (2528 - 2512) 而不是 4? (在上面的代码中)
#include <stdio.h>
int g=0; //initialised to 0 so, stored in bss segment
int main()
{
return 0;
}
C:\Program Files (x86)\Dev-Cpp\MinGW64\bin>size memory-layout.exe
text data bss dec hex filename
10044 2292 2512 14848 3a00 memory-layout.exe
尽管使用了全局变量,bss 没有增量。这是为什么呢?
#include <stdio.h>
int main()
{ static int g; //should be on bss segment
return 0;
}
C:\Program Files (x86)\Dev-Cpp\MinGW64\bin>size memory-layout.ex
text data bss dec hex filename
10044 2292 2512 14848 3a00 memory-layout.exe
尽管使用了静态变量,bss 段没有增加,为什么?
我还有一个问题,dec 在这里代表什么?
【问题讨论】:
-
@a3f 有什么意义
-
查看链接器映射以了解这些变量实际的去向。看起来您的链接器正在以 16 字节增量而不是 4 字节增量来增加节的大小。您可以通过分阶段执行
int a; int b; int c; int d; int e;并注意它的大小何时增加来对此进行试验。int g = 0;案例似乎表明它正在进入.data并且没有增加,因为我们刚刚看到已经有空间了。 -
还要记住,如果编译器意识到变量没有被使用,它们可能会被优化掉;这可能发生在案例 2 和 3 中。
-
案例 1:未初始化的全局:值在 BSS 中。链接器在 BSS 中以 16 字节边界分配空间。因此,BSS 大小增加了 16。 情况 2:初始化为零:编译器不将此视为默认初始化的情况,并将其与其他已初始化的全局变量一起放入数据段中。因此,BSS 情况 3 没有增加:函数内的静态变量。编译器知道你没有使用这个变量。 BSS 中没有分配空间。在以前的情况下,由于这些是全局变量,编译器无法对其进行优化。 dec : 总大小 = 文本 + bss + 十进制数据。
标签: c windows gcc memory-layout