gpt4 book ai didi

c++ - 基于函数返回的STL容器构建效率

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:47 24 4
gpt4 key购买 nike

我有一个返回 STL 容器的工厂函数:

const std::vector<int> f(...) {
std::vector<int> retval;
return retval;
}

我想定义一个STL实例是可以的(没有错误):

const std::vector<int> stl_instance(f(...));

但是这样做有效率吗?

临时STL对象是否直接赋值给STL_instance

最佳答案

返回 const 右值是 C++11 中的反模式。首先考虑返回非常量右值:

std::vector<int> f(int n) 
{
return std::vector<int>(n);
}

int main()
{
std::vector<int> v;
v = f(3);
}

在C++98/03中,这段代码至少会进入堆两次:

  1. 在 f 内创建 vector (如果 RVO 适用)
  2. 从f的返回赋值给v。

如果您的编译器不应用 RVO,您将获得 3 个堆分配。

在 C++11 中,您只能获得 1 个堆分配:在 f 中创建 vector 。这与 RVO 无关。原因是所有的 STL 容器都有带有签名的 move 构造函数和 move 赋值运算符

vector( vector&& other );
vector& operator=( vector&& other );

右值引用 && 会将资源从您的创建函数内部直接 move 到它们的目的地。但是,您的代码具有签名

const std::vector<int> f(int n) 
{
return std::vector<int>(n);
}

将禁用 move 语义,因为 T&&(即 move 构造函数和赋值运算符的参数)不会绑定(bind)到 const 右值参数(即函数的返回值)。这有效地使您的代码在 C++98/03 下运行(即具有 2 或 3 个堆分配)。

关于c++ - 基于函数返回的STL容器构建效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14251010/

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