Performance std的开销::可选<;T>;?

Performance std的开销::可选<;T>;?,performance,g++,c++14,overhead,stdoptional,Performance,G++,C++14,Overhead,Stdoptional,现在已经被接受(或即将被接受),我想知道当以下操作符获取内部值时,会产生什么样的开销和对程序集的影响: -> * value value_or 与无std::optional的情况相比。对于计算密集型程序来说,这可能特别重要 例如,与std::vector相比,std::vector上的操作开销的数量级是多少?->和*应该没有开销。 value和value\u或应该有一个分支的开销:if(active) 此外,复制/移动构造函数、复制/移动赋值、交换、ESPIT、运算符==/COD>、运

现在已经被接受(或即将被接受),我想知道当以下操作符获取内部值时,会产生什么样的开销和对程序集的影响:

->
*
value
value_or
与无
std::optional
的情况相比。对于计算密集型程序来说,这可能特别重要


例如,与
std::vector
相比,
std::vector
上的操作开销的数量级是多少?

->
*
应该没有开销。
value
value\u或
应该有一个分支的开销:
if(active)


此外,复制/移动构造函数、复制/移动赋值、交换、ESPIT、<代码>运算符==/COD>、<代码>运算符> P>除了另一个答案之外,还应该考虑<代码> STD::可选< /COD>需要附加内存。 通常,它不仅仅是一个额外的字节,而是(至少对于“小”类型)由于填充而产生的2倍空间开销

也许RAM不是问题,但这也意味着缓存中可用的值更少

如果特定知识允许使用sentinel值,它可能是更好的选择(可能是以保持类型安全的形式)


一个有趣的阅读是:

您需要一个更精确的测试用例来进行判断。开销可以从可忽略到10倍(防止矢量化和其他优化)。但是你不会用同样的方法,一个有额外的功能,所以它是比较苹果和橘子。“然而,一个大的开销是如此之小,以至于可能无法测量”嗯?在一个紧密的循环中,它肯定会对性能产生影响。例如,与
T==int
比较。(我想这甚至不应该是分支预测失误效应。)@dyp:是的,它确实会对性能产生影响,但在大多数实际代码中,这种影响会在噪声中消失。在人为设计的情况下,可以非常清楚地说明这一点(如您展示的示例所示),但我相信受此严重影响的实际代码量可能是最小的。另一方面,我相信微观优化确实会对现实世界中的代码产生严重的性能影响。我同意这可能在很大程度上取决于实际的程序和上下文(我猜这正是Marc Glisse所说的)。但是OP要求使用
std::vector
,因此我认为对
int
s或
double
s的大向量进行排序可能是一种合理的方案。对于未经检查的版本,与其重写自定义排序,不如更简单地包装迭代器。