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

C 为什么堆栈变量会影响文本段,c,C,然后我稍微修改了上面的代码(向局部变量添加了一些值) A、 B、C是局部变量。在为局部变量赋值之前,文本大小为1415。但是在给局部变量赋值之后,文本大小是1431为什么 堆栈段大小根据局部变量、函数参数和函数调用而变化。该点从一个链接引用,然后函数调用如何影响文本段(请用示例解释) 在这种情况下,文本段将包含用于变量初始化的额外代码 在没有初始值的情况下,堆栈变量将被取消初始化,并显示为包含“随机”值 A、B、C变量的初始化值存储在text段中,因此文本的大小增加。我不确定为什么只增加了2个字

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

  • A、 B、C是局部变量。在为局部变量赋值之前,文本大小为1415。但是在给局部变量赋值之后,文本大小是1431为什么

  • 堆栈段大小根据局部变量、函数参数和函数调用而变化。该点从一个链接引用,然后函数调用如何影响文本段(请用示例解释)


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

    在没有初始值的情况下,堆栈变量将被取消初始化,并显示为包含“随机”值

  • 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();
           }
        }