gpt4 book ai didi

performance - std::optional 的开销?

转载 作者:行者123 更新时间:2023-12-04 17:00:25 25 4
gpt4 key购买 nike

现在std::experimental::optional已经被接受(或将要被接受),我想知道当以下操作符获取内部值时,开销和对汇编产生的后果是什么:

->
*
value
value_or

与没有 std::optional的情况相比。对于计算密集型程序而言,这可能尤其重要。

例如,与 std::vector<std::experimental::optional<double>>相比,对 std::vector<double>进行操作的开销的数量级是多少?

最佳答案

->*应该具有零开销。valuevalue_or应该具有一个分支的开销:if(active)同样,复制/移动构造函数,复制/移动分配,交换,Empplace,operator==operator<和析构函数也应具有一个分支的开销。
但是,一堆开销是如此之小,以至于甚至无法衡量。认真地,编写漂亮的代码,不要担心这里的性能。奇怪的是,使代码漂亮的结果将导致代码的运行速度比您尝试使其更快的速度更快。违反直觉,但还是要这么做。

在某些情况下,开销肯定会变得很明显,例如,对大量optional进行排序。在这些情况下,有四种情况,
(A)已知所有可选内容都为空,在这种情况下,为什么要排序?
(B)某些 optional 可能处于事件状态,也可能不处于事件状态,在这种情况下,需要开销,并且没有更好的方法。
(C)已知所有可选参数都具有提前值,并且您不需要适当的排序数据,在这种情况下,请使用零开销运算符创建数据的副本,而副本使用原始类型而不是optional,然后进行排序。
(D)已知所有可选参数都具有提前值,但是您需要就地排序数据。在这种情况下,optional增加了不必要的开销,解决该问题的最简单方法是执行步骤C,然后使用无开销的运算符将数据移回。

关于performance - std::optional <T>的开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23523184/

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