2016-11-07 51 views
1

当我在函数顶部定义变量并稍后声明变量时,生成的代码有什么区别?例如:在函数顶部声明的变量和稍后声明的变量之间的区别

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

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

+1

没有区别。检查拆卸并查看。顺便说一句,你的代码中的变量都不是“静态”的。 –

+3

“在函数之上”也在函数内部。 – plasmacel

+1

我刚刚将标题中的“静态”编辑出来。 – glglgl

回答

7

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

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

在初始化方面,抽象机(由定义C和C++标准)将初始化(即设置初始值)视为在不同时间发生。 ba与4进行比较后被初始化。当然,按照as-if规则,如果初始化没有副作用,编译器可以按照它认为合适的方式移动初始化轮。这比C++更经常发生,因为C++初始化器通常涉及其他翻译单元中的构造函数,并且编译器无法查看是否存在副作用。

在这种简单的情况下,如果您优化,很可能ab将永远只存储在一个寄存器中,这可能是相同的寄存器。 (这是因为您使用的是原始int变量,并且因为您不重叠使用ab。)