gpt4 book ai didi

C++返回值优化

转载 作者:可可西里 更新时间:2023-11-01 16:26:34 27 4
gpt4 key购买 nike

这段代码:

#include <vector>

std::vector<float> getstdvec() {
std::vector<float> v(4);

v[0] = 1;
v[1] = 2;
v[2] = 3;
v[3] = 4;

return v;
}

int main() {
std::vector<float> v(4);

for (int i = 0; i != 1000; ++i)
{
v = getstdvec();
}
}

我在这里的错误理解是函数 getstdvec 不应该实际分配它返回的 vector 。当我在 valgrind/callgrind 中运行它时,我看到有 1001 次调用 malloc; 1 表示 main 中的初始 vector 声明,1000 表示每次循环迭代。

什么给了?我怎样才能从这样的函数返回一个 vector (或任何其他对象)而不必每次都分配它?

编辑:我知道我可以通过引用传递 vector 。我的印象是可以(甚至更可取)编写这样的函数来返回一个对象而不会导致不必要的分配。

最佳答案

当你调用函数时,返回类型如 std::vector<T>编译器为返回的对象提供内存。被调用函数负责在这个内存槽中构造它返回的实例。

RVO/NRVO 现在允许编译器省略创建本地临时对象、从它复制构造内存槽中的返回值、析构临时对象并最终返回给调用者。相反,被调用函数只是直接在返回槽的内存中构造本地对象,并在函数结束时直接返回。

从调用者的角度来看,这是透明的:它为返回值提供内存,当调用的函数返回时,有一个有效的实例。调用者现在可以使用该对象,并负责调用析构函数并稍后释放内存。

这意味着 RVO/NRVO 仅在您调用函数构造新实例时起作用,而不是在您分配它时起作用。以下是可以应用 RVO/NRVO 的示例:

std::vector<float> v = getstdvec();

但您的原始代码使用了一个循环,并且在每次迭代中,结果来自 getstdvec()需要 build ,这个临时分配给v . RVO/NRVO 无法消除它。

关于C++返回值优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19454068/

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