我有一个关于我沮丧的旅程的故事,我发现我从一个函数返回的无序地图实际上并不是RVO,尽管我确信它是在早期的时候,它是无关的。
有没有一种方法来检查RVO是否发生在任何给定的函数中?或者是为了得到我想要的结果,就像一张清单,上面写着“做”和“不做”?
发布于 2016-03-02 01:13:10
是。为类的生命周期方法创建挂钩:
#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是与a在getA中相同的对象,所以您只会看到
Ctor
Dtor 您可以通过添加一个额外的返回点来抑制RVO:
return a;
return A{a};或移动:
return std::move(a);然后你会看到:
Ctor
Mctor
Dtor
Dtor 发布于 2016-03-02 02:28:45
您可以验证RVO是否在对您很重要的所有地方使用:
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。但是如果其中任何一个被实际使用,链接器就会失败,并告诉你具体发生在哪里。包装是零成本,但需要在调用方和实现方使用它,这可能不是很方便。
https://stackoverflow.com/questions/35736568
复制相似问题