什么是boost :: optional效率?

时间:2013-06-25 07:44:02

标签: c++ dictionary boost-optional

我有以下内容:

class Obj;
typedef std::map<string, string> StrMap;
std::map<std::string, std::pair<Obj, StrMap> > complexMap;

对于complexMap中的某些条目,StrMap将为空,我根本不会使用它,所以为了提高效率,我正在考虑使用boost :: optional。我的问题是什么是提升效率::可选,我担心通过支付它的价格,我最终不会获得任何收益。

3 个答案:

答案 0 :(得分:5)

optional视为可容纳0或1个值的容器。您的地图已经是一个可容纳0到N个元素的容器。因此,可选映射是容器中的容器,可以容纳0到N个元素。真的,这里没有任何好处。

空地图的开销非常小。地图实际上是从内部的地图节点构建的,而空地图则没有任何节点。 (它不能,因为每个节点都有一个值,空映射无法创建默认值)

答案 1 :(得分:2)

如果你正在进行“稀疏”计算,你可以做两件事:

  1. 使用complexMap保留包含大量不存在结果的大型boost::optional。这将稀疏性封装在每个元素的基础上。
  2. 创建一个额外的间接层(例如unordered_map),其中包含指向complexmMap中现有元素的指针。这将稀疏性封装在每个地图的基础上。
  3. 替代方案1对于作为程序员来说会更方便,但需要很少的空间开销。备选方案2将几乎完全节省空间并使complexMap尽可能小,但需要更多的编程工作。

    选择你更容易接受的替代方案(提示:如果你在complexMap进行千兆级别的计算,也许额外的间接级别会得到回报,否则我就不会打扰了。)

    除了空间开销之外,boost::optional几乎没有其他成本,因为它不需要默认构造函数或动态内存分配。

答案 2 :(得分:2)

将评论移至答案......

考虑如何实现可选项,它通常有一些内部存储(允许它保存地图对象 - 就像在上面的代码中那样),唯一的区别是它不构造地图在该存储中 - 这是留待以后使用的。但是必须构造可选对象。所以现在不是仅仅构建一个地图,而是在你不使用地图的情况下构建一个更大的可选对象,当你使用地图时,你也必须构建它。好像你正在做更多的事情而没有什么好处。

有些情况下optional确实有意义(例如返回值,例如,您要指示无效状态,或者您有一个非常昂贵的构造函数,它会对复杂成员进行大量初始化),具有普通构造函数的对象,可选实际上不值得代码混乱。

免责声明:但与所有与效果相关的问题,个人资料,个人资料以及再次发布个人资料......