我在Ubuntu(Linux 2.6)中创建了2个C程序,如下所示
1.c
----
main()
{
}
2.c
----
#include<stdio.h>
main()
{
int a[500];
float f[1000];
double d[100000];
int i = 0;
for(i = 0;i < 10000;i++); // Intentional ;
for(i = 0;i < 10000;i++); // Intentional ;
for(i = 0;i < 10000;i++); // Intentional ;
for(i = 0;i < 10000;i++); // Intentional ;
if(1)
{
}
else
{
}
switch(1)
{
}
while(1);
}
在单独编译和创建可执行文件之后,我检查了两个可执行文件的大小。令我惊讶的是,两个可执行文件的大小相同(7099字节)。
然而,目标文件的大小不同。
有人请解释一下为什么程序1.c和2.c.Program 2.c的可执行文件大小相同,应该使用更多的空间,可执行文件的大小应该增加吗? 链接器如何链接C关键字(如int,float,while,if ..)并创建可执行文件?
非常感谢
答案 0 :(得分:1)
我认为这与优化器有关。但是,对于链接器,我建议阅读以下几点,因为你表现出对链接器的好奇心。阅读这些将有助于任何C&amp; C ++程序员。了解链接实际意味着什么是重要的知识。
欲了解更多信息:
注意:这可能不是您所寻找的,但研究和学习您自己寻找的内容将使您学到的内容持续更长时间。
答案 1 :(得分:0)
能够为问题找到令人信服的解决方案。以下是对此的分析和观察。
在代码2.c中,我添加了许多“的语句(i = 0; i&lt; 10000; i ++); // Intentional;”。在某些时候,观察到2.c的可执行文件的大小增加了4096字节。看起来,链接器默认为代码段分配4k内存,如PAGE Alignment的链接描述文件中所述。对于x86,此大小为4k(COMMONPAGESIZE)。只有在代码大小超过4k后,才会为代码段分配新的4k内存。这就是为什么当更多“for(i = 0; i&lt; 10000; i ++); // Intentional;”语句被添加时,可执行文件的大小增加了。