在函数顶部声明的变量与稍后声明的变量之间的差异

Difference between variable declared at the top of a function and one declared later

本文关键字:声明 变量 之间 函数 顶部      更新时间:2023-10-16

在函数顶部定义变量和稍后声明变量时,生成的代码有什么不同?例子:

int f(int parameter) {
 int a = parameter * 2;
 if (a == 4) 
  return 1;
 int b = parameter * 4;
 if (b == 4) 
  return 2; 
 return 0;
}

输出代码是b变量初始化分配在if (a == 4)之后还是ab变量同时初始化

要查看实际发生了什么,请查看生成的汇编程序。

在分配空间方面,大多数编译器会在函数开始时在堆栈上为函数中使用的所有变量分配足够的空间。(这不是这样发生,但我不知道任何编译器不这样工作。)

在初始化方面,抽象机器(由C和c++标准定义)将初始化(即设置初始值)视为在不同时间发生。ba与4比较后初始化。

当然,根据as-if规则,如果初始化没有副作用,编译器可以在它认为合适的情况下移动初始化。这种情况在C中比在c++中更常见,因为c++初始化式通常涉及其他翻译单元中的构造函数,而编译器无法看到那里是否有副作用。

在这个简单的例子中,如果您进行优化,很可能ab都只存储在一个寄存器中,并且这可能是同一个寄存器。(这是因为您使用的是普通的int变量,并且您没有重叠使用ab)