gpt4 book ai didi

c++ - 当我们返回一个像 vector,list 这样的 C++ 容器时。会发生什么?

转载 作者:行者123 更新时间:2023-11-30 01:40:05 25 4
gpt4 key购买 nike

vector<int> function(...)
{
.......
.......
vector<int> C = some value;
return C
}
int main()
{
X = function(...)
}

x 的值是什么,是像我们返回数组时那样是 C 的地址,还是返回值是复制到 X 中的完整 vector C。在什么情况下应该动态分配容器?如果按引用或按值传递 vector ,最终的 X 会有什么不同吗?

最佳答案

通常,只要你从函数返回一些东西,它就会被复制。当这个 something 有一个复制构造函数时,它就会被触发。例如数组:它们只是指向某个内存块的指针(带有简单的复制构造函数)。所以实际复制的只是指针本身。但是 vector 是相当复杂的类。他们有复制构造函数,实际上复制了整个内容。这不能很好地扩展。

但问题是:您几乎从不动态分配 vector 。在许多情况下(例如在您的伪代码中)由于(命名)返回值优化或其他原因,内容被复制copy elision optimization .它实际上是相同的 vector 。

如果在某些情况下不会触发复制省略(或者您不确定),最好还是通过 ref 将 vector 传递给函数,而不是在堆上动态分配它。在函数中分配内存然后将其返回给调用者是一种反模式(尽管有时是必要的)。这导致了一个大问题:谁负责释放内存?您需要知道函数的源代码(或至少是文档)才能知道这一点。

另一种选择(当复制省略不适用时)是使用 std::move 来避免复制。

另一方面,按值传递 vector 将创建该 vector 的拷贝。您肯定想通过 ref 或 const ref 传递它。

我还鼓励您自己检查所有这些事情。尝试打印原始指针 &C&X 以查看它们是否是同一个对象。

关于c++ - 当我们返回一个像 vector,list 这样的 C++ 容器时。会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44127913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com