struct X {
void * a;
void * b;
};
X foo( void * u, void * v);
Run Code Online (Sandbox Code Playgroud)
类型X的返回值的地址作为隐藏参数传递给foo()
如果使用-O0编译测试代码,则代码按预期工作
如何强制编译器不为foo()添加RVO(又名强制-fno-elide-constructors)?
Update1:代码必须适用于任意编译器(至少gcc,clang,msvc),示例代码:
void * vp = bar();
X x = foo( vp, 0);
x = foo( x.a, 0);
x = foo( x.a, 0);
Run Code Online (Sandbox Code Playgroud)
Update2:问题是,编译器优化了x的实例
X x = foo( vp, 0);
x = foo( x.a, 0);
x = foo( x.a, 0)
Run Code Online (Sandbox Code Playgroud)
要么
X x1 = foo( vp, 0);
X x2 = foo( x1.a, 0);
X …Run Code Online (Sandbox Code Playgroud)