首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有方法检查是否应用了RVO?

是否有方法检查是否应用了RVO?
EN

Stack Overflow用户
提问于 2016-03-02 00:59:02
回答 2查看 1.2K关注 0票数 13

我有一个关于我沮丧的旅程的故事,我发现我从一个函数返回的无序地图实际上并不是RVO,尽管我确信它是在早期的时候,它是无关的。

有没有一种方法来检查RVO是否发生在任何给定的函数中?或者是为了得到我想要的结果,就像一张清单,上面写着“做”和“不做”?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-02 01:13:10

是。为类的生命周期方法创建挂钩:

代码语言:javascript
复制
#include <iostream>

struct A{
  A() 
    { std::cout<<"Ctor\n"; } 
  A(const A& o) 
    { std::cout<<"CCtor\n"; } 
  A(A&& o) 
    { std::cout<<"MCtor\n"; } 
  ~A() 
    { std::cout<<"Dtor\n"; } 
private:
  int vl_;
};

A getA(){
  A a;
  return a;
}

int main(){
  A b = getA();
  return 0;
}

现在使用RVO,b是与agetA中相同的对象,所以您只会看到

代码语言:javascript
复制
Ctor
Dtor 

您可以通过添加一个额外的返回点来抑制RVO:

代码语言:javascript
复制
 return a;
 return A{a};

或移动:

代码语言:javascript
复制
return std::move(a);

然后你会看到:

代码语言:javascript
复制
Ctor
Mctor
Dtor
Dtor 
票数 6
EN

Stack Overflow用户

发布于 2016-03-02 02:28:45

您可以验证RVO是否在对您很重要的所有地方使用:

代码语言:javascript
复制
template<typename T>
struct force_rvo: T {
    force_rvo() {}
    using T::T;
    force_rvo(const force_rvo &);
    force_rvo(force_rvo &&);
};

force_rvo<std::map<int, int>> f() {
    force_rvo<std::map<int, int>> m;
    m[17] = 42;
    return m;
}

int main() {
    auto m = f();
    return m[42];
}

force_rvo类型假装是可复制和可移动的,否则编译器将拒绝return m。但是如果其中任何一个被实际使用,链接器就会失败,并告诉你具体发生在哪里。包装是零成本,但需要在调用方和实现方使用它,这可能不是很方便。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35736568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档