首页 > 解决方案 > 首次访问时分配的智能指针

问题描述

TL; DR:是否存在类似于std::unique_ptr仅实例化封装对象并在指针首次取消引用时分配内存的智能指针类的实现?

背景:

我们有一个Process代表正在运行的进程的类。当进程执行网络通信时,我们记录该活动并将其存储在作为NetworkActivity该类成员的类对象中Process

NetworkActivity是一个有很多成员变量的大类。我正在尝试减少内存使用并NetworkActivity仅为一小部分进程实例化对象,这些进程实际上是通过网络进行通信的。

当然,我可以unique_ptrProcess课堂上使用 a :

std::unique_ptr<NetworkActivity> networkActivityPtr;

networkActivityPtr但是,nullptr每次我取消引用它时,我都需要检查它。如果我忘记了这样的检查并且还没有分配内存,程序就会崩溃。

unique_ptr首次取消引用智能指针时,是否没有构造对象的变体?

标签: c++c++14smart-pointers

解决方案


出于线程安全的目的,您真正想要的是future<NetworkActivity>. 这清楚地区分了访问指针值的行为(它是轻量级且微不足道的线程安全)和创建对象(这是重量级并且需要线程同步以使线程安全)之间的区别。没有人期望future::get很快(它可以是,如果值已经可用,但这不是期望),而每个人都应该期望unique_ptr::get很快。

将这两件事结合起来的类型具有不确定的性能特征。get您想在性能关键代码中做些什么吗?也许,也许不是;这取决于假设在代码执行的那个时刻已经产生了值是否合理。

你可以用withstd::async来做你想做的事情。确保“异步”进程将在与.std::launch::deferredfuturestd::launch::deferredfuture::get


推荐阅读