小编xlr*_*lrg的帖子

禁用一个函数的返回值优化

struct X {
  void * a;
  void * b;
};

X foo( void * u, void * v);
Run Code Online (Sandbox Code Playgroud)
  • foo()在汇编程序(i386)中实现
  • 类型X的返回值的地址作为隐藏参数传递给foo()

  • 如果使用-O0编译测试代码,则代码按预期工作

  • 如果用-O3编译分段错误发生(返回值被优化掉)
  • 如果使用-O3 -fno-elide-constructors编译,代码将再次按预期工作

如何强制编译器不为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)

c++ assembly return-value-optimization rvo nrvo

2
推荐指数
1
解决办法
771
查看次数

标签 统计

assembly ×1

c++ ×1

nrvo ×1

return-value-optimization ×1

rvo ×1