嵌套{}内局部变量的内存分配

时间:2015-06-08 06:48:05

标签: c scope runtime local-variables compile-time

我对var2局部变量的分配几乎没有提问,参考下面的代码。

  1. 何时分配局部变量var2的内存?无论何时调用函数或满足条件并且控制进入var2,是否将分配if(Threshold > 5)

  2. var2置于条件内是否仅限制局部变量的范围?

  3. 保持var2在条件内是否会提高处理速度,因为每次调用函数时都没有分配和取消分配变量?

  4. void fun1(int Threshold)
    {
        int var1 = 0;
        if(Threshold > 5)
        {
            int var2 = 0;
        }
    }
    

2 个答案:

答案 0 :(得分:2)

根据优化级别,可能永远不会分配变量。优化编译器可以抛弃所有未使用的变量,并为具有非重叠寿命的两个变量重用内存。

从汇编程序输出(gcc -S file.c)检查,通常可以看到函数输入后立即分配的所有已使用的变量:

 sub r1, $108   ;;  stack space needed for array[100] (and some)

对应于:

 void func(bool a)
 {
      if (a)
      {
           char array[100];
           subfunc(array, 100);
      } else {
           char array2[15];
           subfunc2(array2, 15);
      }
 }

答案 1 :(得分:1)

  

1。何时将分配局部变量'var2'的内存。

在编译时映射内存(如果分配了变量,即变量没有被编译器优化)。程序加载到内存时分配堆栈。因此,严格来说,它对运行时没有任何影响(成本)。

  

2。将'var2'保持在条件范围内只是限制局部变量的范围。

你是对的。 var2范围仅限于内部区块。

  

3。将'var2'保持在条件内是否会提高处理速度,因为每次调用函数时都不会分配变量和解除分配。

没相关。无论如何,这个(变量定义)将是一个编译时操作。只根据定义块更改范围。