我有一个函数可以生成一种昂贵的对象(包含 vector 和非固定大小的 map ),所以我真的想避免调用复制 c'tors。
到目前为止,我只是从方法中返回了一个 std::shared_ptr 并使用了它,但我认为它很丑陋并且需要类型定义才能真正使用。
我知道有两件事可能对我有帮助。一是复制省略,二是 move 语义。
我的问题是我不知道如何正确使用它们。我的研究告诉我,复制省略完全由编译器完成,而不是 st'd 的一部分。我真的不想完全依赖这个。
那么我如何确保调用 move 赋值并将其放置到位以防止编译器执行复制省略。
ResultSet &&generateResults()
{
//ResultSet a(); :S
ResultSet a;
a.populat(...
//blah blah blah
return a;
}
//else where (where the && assignment operator is overloaded
ResultsSet b = generateResults();
在这种情况下,这是最正确的编码方式吗?如果不是,我该如何改进它。我很高兴仅使用 C++0x 构造。
顺便说一句:我的编译器是 gcc 4.6
最佳答案
您可以在 Dave Abrahams 的博客文章系列中找到对您问题的一个很好的答案:
http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
它涵盖了右值引用、 move 构造函数和复制省略之间的交互。有点长,但值得一读:)
简而言之,复制省略具有优先权。如果由于某种原因它没有(或不能)发生,编译器必须首先考虑 move 构造函数,最后考虑复制构造函数。
关于c++ - 传递重物 C++0x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6397278/