c-为什么堆栈变量会影响文本段


#include <stdio.h>
int main(void)
{
int A,B,C;
return 0;
}

我使用gcc 32位Linux机器编译了上面的程序。我运行了size命令,结果如下。

text    data     bss     dec     hex filename
1415     544       8    1967     7af a.out

然后我稍微修改了上面的代码(给局部变量添加了一些值(。

#include <stdio.h>
int main(void)
{
int A=10,B=20,C=30;
return 0;
}

使用size命令输出

text    data     bss     dec     hex filename
1431     544       8    1983     7bf a.out
  1. ABC是局部变量。在为局部变量赋值之前,text的大小为1415。但在将值分配给局部变量后,text的大小是1431——为什么?

  2. 堆栈段大小根据局部变量、函数参数和函数调用而变化。这一点是从一个链接中引用的,然后是函数调用如何影响文本段(请举例说明(。

在这种情况下,text段将包含用于初始化变量的额外代码。

在没有初始值的情况下,堆栈变量将被取消初始化,并且看起来包含"随机"值。

  1. 存储在text段中的ABC变量的初始化值因此增加了text的大小。我不知道为什么只增加了2个字节,可能是因为你的init值中的1个可以从其他2个值中解释出来,这是某种编译器优化。如果有人知道,请告诉我。:-(

  2. 据我所知,函数调用本身对text段大小没有直接影响。但是,如果您的代码中有一个从未调用过的函数调用,那么编译器可能会对其进行优化,从而减少text段的大小。

让我们想象一下下面的例子:

#define RANDOM_CONDITION 0
void main(void)
{
if(RANDOM_CONDITION)
{
func1();
}
else
{
func2();
}
}

由于条件从未通过,func1()函数调用不可能,因此始终执行func2()函数。因此,func1()函数可以从text段中删除,因为它不是必需的。

您添加了代码来初始化main()函数中的三个变量,因此您的文本段必须更大。

假设这些变量是main()的局部变量,因此它们是在堆栈中占据位置的自动变量。它们从代码中的整数文本中获取值,因此初始化可能只是将带有立即参数的指令移动到堆栈中与堆栈指针(或基指针(相关的位置。它们没有在.data段中初始化,因此在main()函数的每个条目中初始化它们的唯一方法(请记住,main()不是一个特殊的函数,它只是运行时在程序条目中调用的函数(是添加代码以存储在变量本身中。

如果你试图优化编译器输出,可能是因为你在任何地方都不使用这些变量,你会得到更短的输出,因为不再需要为初始化它们而添加的代码(变量本身在任何地方也不使用(。在我的体系结构(amd64/clang编译器(中,两个样本生成的text大小相同。

最新更新