gpt4 book ai didi

c++ - C/C++ : efficient way to use a vector returned by a function

转载 作者:太空狗 更新时间:2023-10-29 20:43:06 25 4
gpt4 key购买 nike

假设我们有一个名为 V 的 vector 类型 vector<int>这是一个类的私有(private)成员。

我们还有这个类的公共(public)函数:

 vector<int> getV(){ return V; }

现在如果我有这个类的一个实例,我想做的就是读取值并找到 vector 中所有值的总和,

我可以这样说:

 MyClass obj;
//update vector
size_t i, size;
size = obj.getV().size();
int sum = 0;
for(size_t i = 0; i < size; i++){
sum += obj.getV().at(i);
}

或者我可以这样说:

  MyClass obj;
//update vector
size_t i, size;
vector<int> myV = obj.getV();
size = myV.size();
int sum = 0;
for(size_t i = 0; i < size; i++){
sum += myV[i];
}

在第二种情况下,我们将整个 vector 复制到 vector myV .但是,我不确定在第一种情况下到底发生了什么,我们是按原样使用 vector 还是在每次调用函数时实际复制 vector getV()

如果没有复制发生,那么我相信第一个版本更有效率。

但是我并不是 100% 知道到底发生了什么。

我想如果我们返回对 vector V 的引用,我们就可以完全避免进行任何复制。 .所以我们可以有以下功能:

vector<int>* getV { return &V; }

然后

 MyClass obj;
//update vector
size_t i, size;
vector<int> * myV = obj.getV();
size = myV->size();
int sum = 0;
for(size_t i = 0; i < size; i++){
sum += myV->at(i);
}

但是我想知道第一种情况到底发生了什么。有没有被复制的东西?即使在第三种情况下,我们也会返回一个指针,因此会发生某种复制。

提前致谢

最佳答案

原则上,在第一种情况下,您会收到整个 vector 的拷贝,对其调用 size(),然后它会立即超出范围。

在实践中,这种情况非常普遍,现代编译器可能能够识别它并完全优化复制。 You can read more about this here, for example.了解您的机器上发生了什么的唯一方法是阅读编译的汇编代码。编辑:或像 Named 那样做堆栈跟踪。 :)

在第三种情况下,您唯一要复制的是指针的值,它是 4 字节或 8 字节(在 64 位操作系统上是 8 字节)。

如果您担心效率,最好的办法始终是:尝试两种方式,看看哪个更快。

关于c++ - C/C++ : efficient way to use a vector returned by a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16435484/

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