c++ - 首次访问时分配的智能指针
问题描述
TL; DR:是否存在类似于std::unique_ptr
仅实例化封装对象并在指针首次取消引用时分配内存的智能指针类的实现?
背景:
我们有一个Process
代表正在运行的进程的类。当进程执行网络通信时,我们记录该活动并将其存储在作为NetworkActivity
该类成员的类对象中Process
。
NetworkActivity
是一个有很多成员变量的大类。我正在尝试减少内存使用并NetworkActivity
仅为一小部分进程实例化对象,这些进程实际上是通过网络进行通信的。
当然,我可以unique_ptr
在Process
课堂上使用 a :
std::unique_ptr<NetworkActivity> networkActivityPtr;
networkActivityPtr
但是,nullptr
每次我取消引用它时,我都需要检查它。如果我忘记了这样的检查并且还没有分配内存,程序就会崩溃。
unique_ptr
首次取消引用智能指针时,是否没有构造对象的变体?
解决方案
出于线程安全的目的,您真正想要的是future<NetworkActivity>
. 这清楚地区分了访问指针值的行为(它是轻量级且微不足道的线程安全)和创建对象(这是重量级并且需要线程同步以使线程安全)之间的区别。没有人期望future::get
很快(它可以是,如果值已经可用,但这不是期望),而每个人都应该期望unique_ptr::get
很快。
将这两件事结合起来的类型具有不确定的性能特征。get
您想在性能关键代码中做些什么吗?也许,也许不是;这取决于假设在代码执行的那个时刻已经产生了值是否合理。
你可以用withstd::async
来做你想做的事情。确保“异步”进程将在与.std::launch::deferred
future
std::launch::deferred
future::get
推荐阅读
- python - RuntimeError:CUDA 错误:设备序号无效
- vue.js - Heroku 部署在没有本地主机运行的情况下无法工作
- sql - 如何在 Informix 12.10 中将行转换为列
- python - AWS SAM:无法解组输入
- c++ - 在 C++ 中创建新对象时将未命名对象作为参数传递
- python - 错误:“str”对象在尝试在数据框中隐藏日期时间时没有属性“shape”
- c++ - 如何在模板类中仅在一种类型的 Vector 中插入数据?
- ruby-on-rails - 在完成测试之前连接失败的 Webmock 测试失败
- sublimetext3 - 如何按行号删除多行
- php - 解决 Akeneo pim 上的用户表错误