65,208
社区成员
发帖
与我相关
我的任务
分享
Test& f()
{
Test t;
t.i=1;
return t;
}
Test g()
{
Test t;
t.i=1;
return t;
}
int main()
{
Test t1=f(); //---(1)
Test t2=g(); //---(2)
}
void g(Test* t)
{
t->i=1;
}
char c;
.
.
.
if(c>0X38)
...;
是不是可能导致未定义行为?或者准确来讲是Implementation Defined行为!
但如果我能够确保c的范围来保证此语句永远不会发生未定义行为。
同理,返回局部对象的引用,只有当局部对象所在的空间被污染了,才可能导致出错;没污染就不会出错。会不会被污染这一行为是未定义的!
我要做的就是确保该数据不被污染(破坏)!
或许我压根就做不到??
这才是我想问的,就目前而言,没有人给出我不可控的证据!
PS:准备结帖了,这个东西找工作意义不大!!
)
第2个问题确实是在返回栈中即在main栈中,我通过赋值操作然后汇编发现,在返回栈中的返回的临时变量其实也就是函数g()中的局部变量t。也就是说,g()中的局部变量也放在了main()栈中而非g()栈中,但g()中保存了指向其局部变量的指针!
事实上,如果返回被调用函数的局部变量的值类型,根本就没有所谓的”临时对象”,这个临时对象会被编译器优化成了被调用函数的局部对象!!这一点,我发现很多书都说错了,包括许多国外的书!当然,或许理论上是对的,我目前只有GCC,没试过VS编译器!
PS:关于返回值类型会返回”临时对象”这个问题,我很早就持怀疑态度,因为我觉得编译器不一定非要进行多一步的复制操作,尤其是返回的是较大的类对象,这样效率比较低!兄弟如果有VS可以看看VS的处理方式,thx![/quote]
#include<stdio.h>
struct test
{
~test()
{
puts( "~test" );
}
int val[10];
};
test f(){ test x;return x;}
int main()
{
test x = f();
return 0;
}
VS系列,都是输出2次~test
)
第2个问题确实是在返回栈中即在main栈中,我通过赋值操作然后汇编发现,在返回栈中的返回的临时变量其实也就是函数g()中的局部变量t。也就是说,g()中的局部变量也放在了main()栈中而非g()栈中,但g()中保存了指向其局部变量的指针!
事实上,如果返回被调用函数的局部变量的值类型,根本就没有所谓的”临时对象”,这个临时对象会被编译器优化成了被调用函数的局部对象!!这一点,我发现很多书都说错了,包括许多国外的书!当然,或许理论上是对的,我目前只有GCC,没试过VS编译器!
PS:关于返回值类型会返回”临时对象”这个问题,我很早就持怀疑态度,因为我觉得编译器不一定非要进行多一步的复制操作,尤其是返回的是较大的类对象,这样效率比较低!兄弟如果有VS可以看看VS的处理方式,thx!