由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 以下两个C 代码是不是完全等价?
相关主题
a simple design questionC++ copy elision和move的区别?
两个我永远都不想碰的语言C语言的变量都一定要放在stack上吗?
老码农冒死揭开行业黑幕:如何编写无法维护的代码(zz)[合集] const 变量问题
C编译器为何允许一个函数在某个路径不返回值?c的小问题
C怪问题一个C++编程问题:union inside struct
有人上过coursera的compiler么?[合集] C代码这么写,居然没有错。
真是奇了怪了,VC编译器问题?Initialization list的一个问题
急,VC7.1编译错误问个C++编译器如何处理函数内的static 变量
相关话题的讨论汇总
话题: fooa话题: 代码话题: int话题: 变量话题: ret
进入Programming版参与讨论
1 (共1页)
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();

1 (共1页)
进入Programming版参与讨论
相关主题
问个C++编译器如何处理函数内的static 变量C怪问题一个
g++编译了不该过的C++代码有人上过coursera的compiler么?
问个内存的问题真是奇了怪了,VC编译器问题?
问个C++ 编译器临时变量的问题 (转载)急,VC7.1编译错误
a simple design questionC++ copy elision和move的区别?
两个我永远都不想碰的语言C语言的变量都一定要放在stack上吗?
老码农冒死揭开行业黑幕:如何编写无法维护的代码(zz)[合集] const 变量问题
C编译器为何允许一个函数在某个路径不返回值?c的小问题
相关话题的讨论汇总
话题: fooa话题: 代码话题: int话题: 变量话题: ret