c++ - 从函数返回 std::vector 会是一个浅拷贝吗?

标签 c++ visual-studio-2010 vector

假设我有两个函数。一个返回 std::vector<int>另一个返回一个具有 std::vector<int> 的类成员(member)。

// 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 人员可以使用移动操作有效地将一个 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/

相关文章:

c++ - 错误 C2668 对来自站点 http ://h264bitstream. sourceforge.net/的重载函数代码的模糊调用

c++ - 排序 vector 对

c++ - 从重载的复制构造函数中调用默认复制构造函数

c++ - 运算符重载中的 C++ 语法不清晰

c++ - 在 std::map 的元素上设置数据断点

c++ - 如何有选择地为 VS2010 构建 Qt?

c++ - Openmp 和减少 std::vector?

c++ - 将 vector 添加到 vector

c++ - VC++ 仍然在顺序一致方面被破坏吗?

C++:具有 `std::lock_guard` 的互斥量是否足以同步两个 `std::thread`?