gpt4 book ai didi

c++ - 什么时候复制 vector ,什么时候传递引用?

转载 作者:可可西里 更新时间:2023-11-01 18:29:33 34 4
gpt4 key购买 nike

我正在使用一个经常使用 std::vector 的程序。还有很多分配/取消分配正在进行,有数十亿次,我正在努力避免尽可能多的分配/取消分配。由于我是 C++ 的新手,我对使用 vector 时发生的分配有一些疑问(例如,向其添加元素时)。我在 Win7 64 位机器上,程序是 32 位的,我使用的是当前版本的 MinGW 编译器。

我想知道,在以下情况下会发生什么,即如果 vector 被复制,作为引用传递,...

1.

std::vector<T> fillVector() {
std::vector<T> returnVector;
...
return returnVector;
}

std::vector<T> myVector = fillVector();

2.

 std::vector<T>& fillVector() {
std::vector<T>* returnVector = new std::vector<T>;
...
return (*returnVector);
}

std::vector<T> myVector = fillVector();

3.

std::vector<T>* fillVector() {
std::vector<T>* returnVector = new std::vector<T>;
...
return returnVector;
}

std::vector<T>* myVector = fillVector();

以及以下不同的操作:

4.

std::vector<T> myVector1;
... (myVector1 being filled)
std::vector<T> myVector = myVector1;

5.

std::vector<T>* myVector1 = new std::vector<T>;
... (myVector1 being filled)
std::vector<T> myVector = (*myVector1);

假设我不想更改 myFunction 中的参数/更改为 myFunction 中的 myVector 不会伤害其余部分程序:

6.

void myFunction(std::vector<T> myParam) {
...
}

std::vector<T> myVector;
... (myVector being filled)
myFunction(myVector);

7.

void myFunction(std::vector<T>& myParam) {
...
}

std::vector<T> myVector;
... (myVector being filled)
myFunction(myVector);

如果我的理解是正确的,最快的选项(意味着传递引用而不是创建拷贝并传递它们)将是 2/3、5 和 7。如果我错了请纠正我!

最佳答案

1.

std::vector<T> fillVector() {
std::vector<T> returnVector;
...
return returnVector;
}

std::vector<T> myVector = fillVector();

这很好。 vector按值返回,但在(命名的)返回值优化下,大多数编译器(至少在打开优化时)省略了对复制构造函数的调用。

此外,在 C++11 中,移动语义确保调用移动构造函数而不是复制构造函数,复制构造函数将简单地窃取返回 vector 的内容,而不会生成昂贵的拷贝。

2.

 std::vector<T>& fillVector() {
std::vector<T>* returnVector = new std::vector<T>;
...
return (*returnVector);
}

std::vector<T> myVector = fillVector();

不要这样做。动态分配的不必要开销,加上必须记住必须释放返回对象的负担。避免手动内存管理,更喜欢 1。

3.

std::vector<T>* fillVector() {
std::vector<T>* returnVector = new std::vector<T>;
...
return returnVector;
}

std::vector<T>* myVector = fillVector();

同上。避免手动内存管理。

4.

std::vector<T> myVector1;
... (myVector1 being filled)
std::vector<T> myVector = myVector1;

这是概念上不同的操作。您在这里创建一个拷贝,看起来您做对了。在 C++11 中你可能想使用 std::vector<T> myVector = std::move(myVector1)如果您只需要传输 myVector1 的内容而不是复制它。

5.

std::vector<T>* myVector1 = new std::vector<T>;
... (myVector1 being filled)
std::vector<T> myVector = (*myVector1);

同上,您想要创建一个拷贝,但是您不必要地动态分配 vector 。这又将迫使您手动处理它的生命周期,这很糟糕且容易出错。不要这样做。

6.

void myFunction(std::vector<T> myParam) {
...
}

std::vector<T> myVector;
... (myVector being filled)
myFunction(myVector);

这里你路过myVector按值(value)。这是否可以优化取决于什么 myFunction应该与它的论点有关:它应该改变它吗?如果是这样,您是否希望这些更改在函数返回后可见?如果是,按值传递是正确的并且没有办法对其进行优化除非您想要乘坐myVector对象:在这种情况下,在 C++11 中,您可以在将其传递给函数时移动它。这将避免昂贵的、不必要的拷贝。

7.

void myFunction(std::vector<T>& myParam) {
...
}

std::vector<T> myVector;
... (myVector being filled)
myFunction(myVector);

这将通过引用传递,只要能看到 myFunction 的副作用就可以了在 myVector从函数返回后。不能笼统地说这是否正确,这取决于您的应用程序的特定逻辑。

关于c++ - 什么时候复制 vector ,什么时候传递引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15120264/

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