我对var2
局部变量的分配几乎没有提问,参考下面的代码。
何时分配局部变量var2
的内存?无论何时调用函数或满足条件并且控制进入var2
,是否将分配if(Threshold > 5)
?
将var2
置于条件内是否仅限制局部变量的范围?
保持var2
在条件内是否会提高处理速度,因为每次调用函数时都没有分配和取消分配变量?
void fun1(int Threshold)
{
int var1 = 0;
if(Threshold > 5)
{
int var2 = 0;
}
}
答案 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'保持在条件内是否会提高处理速度,因为每次调用函数时都不会分配变量和解除分配。
没相关。无论如何,这个(变量定义)将是一个编译时操作。只根据定义块更改范围。