h*****n 发帖数: 209 | 1 突然间有点不确定了,以下两个C代码应该是完全等价的吧?
代码 1:
int fooA()
{
//blabla
}
int fooB()
{
int ret;
ret = fooA();
return ret;
}
代码 2:
int fooA()
{
//blabla
}
int fooB()
{
return fooA();
}
代码1是不是把temp的值放在寄存器(e.g., EAX)里面返回了?
代码2是不是也会在stack里面分配一个临时变量(跟代码1一样),然后把fooA()的值赋
给这个临时变量,这个临时变量的值再放在寄存器里面返回? |
a*****g 发帖数: 19398 | 2 这个东西真有很多不确定性
有些编译器会优化的,甚至把你无用的变量给优化掉了
【在 h*****n 的大作中提到】 : 突然间有点不确定了,以下两个C代码应该是完全等价的吧? : 代码 1: : int fooA() : { : //blabla : } : int fooB() : { : int ret; : ret = fooA();
|
d***a 发帖数: 13752 | 3 生成的机器代码应该是一样的,如果编译器不乱来的话。 |
b*******s 发帖数: 5216 | 4 在编译器优化前,第一个要多一个局部变量分配
优化后我感觉可能是一样的,某些场合都不需要生成任何临时变量
【在 h*****n 的大作中提到】 : 突然间有点不确定了,以下两个C代码应该是完全等价的吧? : 代码 1: : int fooA() : { : //blabla : } : int fooB() : { : int ret; : ret = fooA();
|
a*********a 发帖数: 3656 | 5 和编译器以及优化程度有关。具体的可以在gdb里看下汇编.
gdb> disassemble
【在 h*****n 的大作中提到】 : 突然间有点不确定了,以下两个C代码应该是完全等价的吧? : 代码 1: : int fooA() : { : //blabla : } : int fooB() : { : int ret; : ret = fooA();
|
a**********t 发帖数: 631 | 6 对于现代的编译器来说,第一个完全可以优化到和第二个一样。Depends on how
aggressive the compiler is.
【在 h*****n 的大作中提到】 : 突然间有点不确定了,以下两个C代码应该是完全等价的吧? : 代码 1: : int fooA() : { : //blabla : } : int fooB() : { : int ret; : ret = fooA();
|