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

s.p*_*zko 1 c c++ gcc

当我在函数顶部定义变量时以及稍后声明它时生成的代码有什么区别.例:

int f(int parameter) {
 int a = parameter * 2;
 if (a == 4) 
  return 1;
 int b = parameter * 4;
 if (b == 4) 
  return 2; 
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是否有代码b后变量初始化和分配if (a == 4)或意志ab变量在同一时刻被初始化?

Mar*_*ica 7

要查看实际发生的情况,请查看生成的汇编程序.

在分配空间方面,大多数编译器将在函数开始时为函数中使用的所有变量分配足够的空间.(这不具有发生这样的,但我不知道是哪个不喜欢这个工作,任何编译器.)

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

当然,通过as-if规则,如果初始化没有副作用,编译器可以根据需要移动初始化轮.这种情况在C语言中比在C++中更常发生,因为C++初始化程序通常涉及其他翻译单元中的构造函数,并且编译器无法查看是否存在副作用.

如果您优化这种简单的情况下,很可能既ab仅会被存储在寄存器中,而这很可能是同一个寄存器.(这是因为你使用普通int变量,因为你没有重叠使用ab.)