使用boost::shared_ptr而不是boost::optional的缺点
Drawbacks of using boost::shared_ptr instead of boost::optional
谁能解释一下,在内存和性能方面,使用boost::shared_ptr
来表示一个可能是null
或未定义的值,而不是使用boost::optional
,是否有缺点?
我看到,在我工作的地方,许多人使用boost::shared_ptr
来表示可以是null
的值。在性能或内存使用方面是否有开销?
除了shared_ptr
还必须管理线程安全引用计数这一明显事实之外,还存在分配问题。optional
是基于堆栈的,这意味着它不会执行任何动态分配。shared_ptr
必须执行至少一个(通常是两个:对象和控制块)动态分配。
optional
不做上述任何一项。
shared_ptr
有许多额外的责任-像引用计数-所以确实有内存和同步的开销。仅仅因为这个原因而使用shared_ptr
是愚蠢的。
optional<T>
是否为T
的实例。shared_ptr
是一个指向T
的智能指针,或者不是。
与共享指针相比,任何按值传递正确且有效的东西都将按可选传递正确且有效。
分配是相当昂贵的操作,按值有时就是您所指的。此外,optional
清楚地表达了您的意思,而shared_ptr
有许多含义。
相关文章:
- boost 是否有按特殊类型值编码状态"compact optional"?
- 如何正确地将 boost::optional<std::chrono::d uration> 作为函数参数?
- 我已经编写了C++代码将 boost::optional 视为一个范围,但它无法编译
- 将 std::vector<boost::optional<double>> 转换为 std::vector<double>
- 为什么 boost::optional::is_initialized() 被弃用了?
- 如何将构造函数参数转发到 boost::optional
- 如何在 setter 方法中设置 boost::optional 成员变量的值?
- boost::any_cast 和 std::optional's
- 如何将boost::optional设置回未初始化状态
- 我可以安全地指向重新分配的boost::optional的数据吗?
- 使用boost::optional时避免使用temporary
- 从boost::optional中检索对象
- 使用boost::optional失败
- 使用boost::optional捕获和包装异常
- 使用boost::shared_ptr而不是boost::optional的缺点
- 继承虚拟函数的类的boost::optional失败的原因
- 对于最简单的类型,我应该使用boost::optional来表示可以为null的int double等吗
- 将boost::optional与boost::adapter::indirected一起使用
- 带有const成员的Boost::optional
- 为什么不使用boost::optional作为更好的scoped_ptr呢?