std::vector create() {
std::vector<HeavyType> temp = {... 10 objects }; // супер тяжелые объекты
return temp;
}
在实践中,我从来没有遇到过这个问题,问题是在面试时,我不能
为了理解 rofl 是什么,我要补充一点,假设 HeavyType 是一个非常重的数据类型
std::vector create() {
std::vector<HeavyType> temp = {... 10 objects }; // супер тяжелые объекты
return temp;
}
在实践中,我从来没有遇到过这个问题,问题是在面试时,我不能
为了理解 rofl 是什么,我要补充一点,假设 HeavyType 是一个非常重的数据类型
因为
std::initializer_list(向量构造函数参数)是通过一个地方制作的。它存储 const 元素,因此它们将被复制而不是移动。但
return temp;一切都很好。向量(不是元素)只有一次移动,或者更可能是什么都没有(如果 NRVO 有效)。请注意,这仅适用于
std::initializer_list,而不适用于任何大括号列表。在最坏的情况下,所有重对象都被复制两次:一次是在 时
push_back,第二次是从函数返回向量时。第二个副本可以优化(NRVO),第一个应该通过更改push_back为删除emplace_back。但即使 NRVO 失败,编译器也会使用所有向量都有的移动构造函数。此构造函数不会复制重对象本身,只会复制向量标头 - 几个字节。
以防万一,设计没有不必要的副本: