现在 std::experimental::Optional 已被接受(或即将被接受),我想知道当通过以下运算符获取内部值时生成的程序集的开销和后果是多少:
->
*
value
value_or
与没有
std::optional
的情况相比。这对于计算密集型程序尤其重要。
例如,与
std::vector<std::experimental::optional<double>>
相比,std::vector<double>
上的操作开销的数量级是多少?
->
和 *
的开销应该为零。
value
和 value_or
应该有一个分支的开销:if(active)
此外,复制/移动构造函数、复制/移动赋值、交换、emplace、
operator==
、operator<
,以及析构函数也应该有一个分支的开销。
然而,一堆开销是如此之小,甚至可能无法测量。 说真的,写漂亮的代码,不要担心这里的性能。 很可能使代码变得漂亮会导致它运行得比你试图使其更快的速度更快。 违反直觉,但无论如何都要这样做。
在某些情况下,开销会变得明显,例如对大量
optional
进行排序。 在这些情况下,有四种情况:
optional
,然后排序 that。optional
会增加不必要的开销,解决该问题的最简单方法是执行步骤 C,然后使用无开销运算符将数据移回。
std::optional
需要额外的内存。通常它不仅仅是一个额外的字节,而是(至少对于“小”类型)由于填充而产生的
2x 空间开销。
也许 RAM 不是问题,但这也意味着缓存中可用的值更少。哨兵值,如果特定知识允许使用它,可能是更好的选择(可能以 的形式来保持类型安全)。 有趣的阅读是: