C 为什么堆栈变量会影响文本段
然后我稍微修改了上面的代码(向局部变量添加了一些值)C 为什么堆栈变量会影响文本段,c,C,然后我稍微修改了上面的代码(向局部变量添加了一些值) A、 B、C是局部变量。在为局部变量赋值之前,文本大小为1415。但是在给局部变量赋值之后,文本大小是1431为什么 堆栈段大小根据局部变量、函数参数和函数调用而变化。该点从一个链接引用,然后函数调用如何影响文本段(请用示例解释) 在这种情况下,文本段将包含用于变量初始化的额外代码 在没有初始值的情况下,堆栈变量将被取消初始化,并显示为包含“随机”值 A、B、C变量的初始化值存储在text段中,因此文本的大小增加。我不确定为什么只增加了2个字
在这种情况下,
文本
段将包含用于变量初始化的额外代码
在没有初始值的情况下,堆栈变量将被取消初始化,并显示为包含“随机”值
A
、B
、C
变量的初始化值存储在text
段中,因此文本的大小增加。我不确定为什么只增加了2个字节,可能是因为1个init值可以从2个其他值解释,这是某种编译器优化。如果有人知道,请告诉我。:-)
文本
段大小没有直接影响。但是,如果代码中有一个从未调用过的函数调用,那么编译器可能会对其进行优化,因此文本段大小会减小
text data bss dec hex filename
1431 544 8 1983 7bf a.out
由于条件从未通过,因此无法调用
func1()
函数,因此始终执行func2()
函数。因此,可以从文本
段中删除func1()
函数,因为它不是必需的。您已经添加了代码来初始化main()
函数中的三个变量,因此文本段必须更大
假设这些变量是main()
的本地变量,因此它们是自动变量,在堆栈中占有一席之地。它们从代码中的整型文字中获取值,因此初始化可能只是一条带有立即参数的移动指令,指向堆栈中与堆栈指针(或基指针)相关的位置。它们不是在.data
段中初始化的,因此在main()
函数的每个条目中初始化它们的唯一方法(请记住main()
不是一个特殊的函数,它只是运行时在进入程序时调用的函数)是添加代码以存储在变量本身中
如果您尝试优化编译器输出,可能由于您不在任何地方使用这些变量,您将获得更短的输出,因为不再需要为初始化它们而添加的代码(变量本身在任何地方都不使用)。在我的体系结构(amd64/clang编译器)中,两个示例生成相同的
文本大小。尝试分解文本部分的内容,我想您会看到不同之处。
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;
}
text data bss dec hex filename
1431 544 8 1983 7bf a.out
#define RANDOM_CONDITION 0
void main(void)
{
if(RANDOM_CONDITION)
{
func1();
}
else
{
func2();
}
}