这可能是一个较旧的查询,但到目前为止我找不到任何令人满意的答案。为了检查文件的内存映射,我编写了一个小 hello 程序。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Hello\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在编译后,当我size在其目标文件上使用命令时,我得到:
# size hello
text data bss dec hex filename
1133 492 16 1641 669 hello
Run Code Online (Sandbox Code Playgroud)
我也检查了其他文件的大小。我总是得到 bss 为 16。bss 是固定的吗?这是包含在数据中还是不包含在数据中。我的意思是这 16 是否包含在 492 中。据我了解,bss是未初始化的数据段。
BSS 部分的大小因程序而异。它描述了用“所有字节为零”初始化的数据量。这些零实际上并不存储在目标文件中,而是存储了 BSS 部分的大小。
\n\n数据部分包含所有未初始化为“所有字节为零”的数据结构的初始值;不同程序之间的差异也有所不同。它不包括BSS部分中包含的空间。
\n\n你会得到一个更大的 BSS 部分,如下所示的程序:
\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <time.h>\n\nenum { A_SIZE = 100 };\nstatic int a[A_SIZE];\n\nint main(void)\n{\n srand(time(0));\n for (int i = 0; i < A_SIZE; i++)\n a[i] = i;\n for (int i = A_SIZE; i > 0; i--)\n {\n int j = rand() % i; // Not good random number generation!\n int t = a[j];\n a[j] = a[i-1];\n a[i-1] = t;\n }\n for (int i = 0; i < A_SIZE; i++)\n printf("%d\\n", a[i]);\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n该代码将数字从 0 洗牌到 99,随机数生成中存在一些偏差(因此它不是完美的洗牌,但这实际上不是练习的重点 \xe2\x80\x94 它只是非- 使用静态数组的简单代码,即使局部变量就足够了)。当我运行size(在 Ubuntu 13.10 上)时,我得到:
text data bss dec hex filename\n1593 584 432 2609 a31 shuffle\nRun Code Online (Sandbox Code Playgroud)\n\n为了进行比较,在问题中的“hello”程序上,我得到:
\n\ntext data bss dec hex filename\n1200 560 8 1768 6e8 hello\nRun Code Online (Sandbox Code Playgroud)\n\n主要区别在于数组a占用400字节;BSS的另外24个字节属于其他代码。
| 归档时间: |
|
| 查看次数: |
1107 次 |
| 最近记录: |