假设我有两个函数。一个返回 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/