struct X {
void * a;
void * b;
};
X foo( void * u, void * v);
如何强制编译器仅为 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);
Update2:
问题是,编译器优化了 x 的实例
X x = foo( vp, 0);
x = foo( x.a, 0);
x = foo( x.a, 0)
or
X x1 = foo( vp, 0);
X x2 = foo( x1.a, 0);
X x3 = foo( x2.a, 0)
没关系。例如发生段错误是因为
X x2 = foo( x1.a, 0);
x1 被优化并且实现尝试访问第一个参数
,这是一个空指针。