假设我有两个功能。一个返回std::vector<int>,另一个返回具有std::vector<int>成员的类。

// using only the vector
std::vector<int> buildVector(){
     std::vector<int> value;
     // build the vector...
     return value;
};

// using and returning a class instead
struct Something{
    std::vector<int> m_vector;
}
Something buildSomething(){
     Something value;
     // build the object...
     return value;
};

这两个函数buildVector()buildSomething()是否会对它们返回的对象执行浅拷贝(避免不必要的堆分配)?还是不会?还是他们的行为有所不同?

我假设 vector 的内部指针将保持有效,除非我弄错了,并且局部变量决定取消分配此内存。 (他们会吗?)

我本身并不追求性能,但是我不想执行不需要的分配。以这种形式编写函数对于我正在做的事情来说是最自然的。

我的编译器不使用C++ 11。与以前的标准相比,当前标准是否会出现不同的情况?

最佳答案

简短的答案:在C++ 11之前,它将复制每个元素。它将在一侧分配一个缓冲区并执行memcpy等操作。由于 vector 存储连续内存,因此非常快,非常有效。指向由值返回的堆栈 vector 的指针可能不再有效。

在C++ 11中,Std lib伙计们可以使用move操作将一个 vector 中的内脏有效地“窃取”到另一个 vector 中,从而仅进行了两次指针交换。这是特定于实现的,因此尽管您的编译器可能是C++ 11,但Stdlib可能不是最新的。 C++ 14使其变得更加透明和令人敬畏,但是同样,您的Stdlib平台实现可能无法更新以利用Move语义。

作为附带说明,“三个规则”已成为“五个规则”。参见Rule-of-Three becomes Rule-of-Five with C++11?

我希望找出语言使用人员是否可以对此做些...某种编译器魔术,使其再次成为三个规则,以防止代码膨胀。

关于c++ - 从函数返回std::vector是浅表拷贝吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25064199/

10-11 22:43
查看更多