gpt4 book ai didi

c++ - 大 vector 的返回值优化与 auto_ptr

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:06 25 4
gpt4 key购买 nike

如果我使用 auto_ptr 作为填充大 vector 的函数的返回值,这会使该函数成为源函数(它将创建一个内部 auto_ptr 并在返回非 const auto_ptr 时移交所有权)。但是,我不能将此函数与 STL 算法一起使用,因为为了访问数据,我需要取消对 auto_ptr 的引用。我猜一个很好的例子是大小为 N 的 vector 场,每个 vector 有 100 个分量。如果 N 很大,则函数按值或按 ref 返回每个 100 个分量 vector 是不一样的。

此外,当我尝试这个非常基本的代码时:

class t
{
public:
t() { std::cout << "ctor" << std::endl; }
~t() { std::cout << "dtor" << std::endl; }
};

t valueFun()
{
return t();
}

std::auto_ptr<t> autoFun()
{
return std::auto_ptr(new t());
}

autoFun 和 fun 调用都会产生输出

中心作者

所以我实际上看不到正在创建的要传递给 return 语句的自动变量。这是否意味着为 valueFun 调用设置了返回值优化?在这种情况下,valueFun 是否会创建两个自动对象?

然后我如何使用函数优化如此庞大的数据结构?

最佳答案

为此有很多选择,动态分配可能不是最好的。


在我们深入讨论之前:这是瓶颈吗?

如果您没有分析并确保它是一个瓶颈,那么这个讨论可能会完全结束......请记住,分析调试构建几乎没有用。


现在,在 C++03 中有几个选项,从最适合的到最不适合的:

  • 相信编译器:例如,即使在 gcc 的调试版本中,未命名变量也使用 RVO。
  • 使用“out”参数(通过引用传递)
  • 在堆上分配并返回一个指针(智能与否)
  • 检查编译器输出

就个人而言,除非分析器证明我错了,否则我会相信我的编译器。

在 C++11 中,移动语义帮助我们变得更加自信,因为无论何时有 return声明,如果 RVO 无法启动,则可以自动使用移动构造函数(如果可用);并在 vector 上移动构造函数非常便宜。

于是变成了:

  • 信任编译器:RVO 或移动语义
  • 在堆上分配并返回 unique_ptr

但实际上第二点应该只用于移动语义没有多大帮助的少数类:移动语义的成本通常与 sizeof 的返回成正比。 ,例如 std::array<T,10>大小等于 10*sizeof(T)所以它不是很好,可能会受益于堆分配 + unique_ptr .


正切:您已经信任您的编译器。你相信它会警告你错误,你相信它会警告你危险/可能不正确的构造,你相信它会正确地将你的代码转换为机器汇编,你相信它会应用有意义的优化来获得不错的加速。 . 不相信编译器在明显的情况下应用 RVO 就像不相信你的心脏外科医生有 10 美元的钞票:这是你最不担心的事情。 ;)

关于c++ - 大 vector 的返回值优化与 auto_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10449907/

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