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

时间:2016-11-07 11:54:45

标签: 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;
}

输出代码在b之后是否有if (a == 4)变量初始化和分配,或者ab变量会在同一时间初始化?

1 个答案:

答案 0 :(得分:7)

要查看实际的内容,请查看生成的汇编程序。

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

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

进行比较后,a被初始化

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

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