有没有办法通过将引用计数存储在受控对象内来提高shared_ptr的效率?

2023-12-11

这正在成为我的代码中的常见模式,因为当我需要管理一个不可复制的对象时,因为 A. 它是“重”或 B. 它是操作系统资源,例如关键部分:

class Resource;

class Implementation : public boost::noncopyable
{
    friend class Resource;
    HANDLE someData;
    Implementation(HANDLE input) : someData(input) {};
    void SomeMethodThatActsOnHandle() {
        //Do stuff
    };
public:
    ~Implementation() { FreeHandle(someData) };
};

class Resource
{
    boost::shared_ptr<Implementation> impl;
public:
    Resource(int argA) explicit {
        HANDLE handle = 
            SomeLegacyCApiThatMakesSomething(argA);
        if (handle == INVALID_HANDLE_VALUE)
            throw SomeTypeOfException();
        impl.reset(new Implementation(handle));
    };
    void SomeMethodThatActsOnTheResource() {
        impl->SomeMethodThatActsOnTheHandle();
    };
};

这样,shared_ptr 就可以解决引用计数的问题,允许Resource是可复制的,即使底层句柄只有在所有对它的引用都被销毁后才应关闭。

然而,如果我们可以将数据移动到内部,我们似乎可以节省分配shared_ptr的引用计数的开销以及单独的开销Implementation不知何故,就像 boost 的侵入式容器一样。

如果这让一些人对过早的优化感到烦恼,那么我实际上同意我当前的项目不需要它。但我很好奇这是否可能。


部分解决方案是使用make_shared来创造你的shared_ptrs。例如,

auto my_thing = std::make_shared<Thing>();

代替

auto my_thing = std::shared_ptr<Thing>(new Thing);

它仍然是非侵入性的,因此不需要改变其他任何东西。良好的实施make_shared结合引用计数和对象本身的内存分配。这节省了内存分配并使计数接近对象以获得更好的局部性。它不像类似的东西那么有效boost:intrusive_ptr,但值得考虑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法通过将引用计数存储在受控对象内来提高shared_ptr的效率? 的相关文章

随机推荐

  • 在 .NET 中,“for”或“foreach”哪个循环运行得更快?

    在C VB NET NET中 哪个循环运行得更快 for or foreach 自从我读到for循环比a更快foreach loop a 很久以前我假设它适用于所有集合 通用集合 所有数组等 我在谷歌上搜索并找到了一些文章 但大多数都是不确
  • 有没有办法检查 git 标签是否与相应提交的内容匹配?

    在我工作的公司中 有些项目有project info文件包含程序 库 其他内容的当前版本 实际上 当有人想要标记一个版本时 他必须首先确保project info文件 已版本化 是最新的 并且包含与他要创建的标签名称相同的版本 不用说这很容
  • Red5视频流录制中断

    最后 我创建了一个流视频录像机 Flash 应用程序及其简单的 Red5 后端 但当然 Red5 又跟我开玩笑了 大多数时候 录制的视频都已损坏 如果不随机停止 恢复就无法播放它们 挂出播放器 还有我 它为什么要这样做 我在网上查了一下 发
  • 当我写入超过数组末尾时,为什么我的程序不会崩溃?

    为什么下面的代码可以在运行时没有任何崩溃的情况下工作 而且大小完全取决于机器 平台 编译器 在 64 位机器上我什至可以给出最多 200 个 操作系统如何检测主函数中的分段错误 int main int argc char argv int
  • WebSocket 握手:意外响应代码:404 -

    我正在学习 websockets 并按照此处的说明进行操作 http www oracle com webfolder technetwork tutorials obe java HomeWebsocket WebsocketHome h
  • XML 错误:有多个根元素

    我正在从 Web 服务获取 XML XML 如下所示
  • 如何使用 CSS3 无限地动画我的图像

    我有一张具有以下样式的图像 img src images head tails gif class graphs graphs webkit transition all 2s ease moz transition all 2s ease
  • 如何在 PHP 中获取值 contentEditable

    我们如何在 PHP 中以 html 格式获取 contentEditable 中存在的内容 例如 我有这段代码 想要在 PHP 的变量中获取它的值 div type here img src div 因为我想用它作为电子邮件的 html 正
  • 点击油猴按钮

    任何人都可以帮我使用greasemonkey 单击此按钮吗 http mibpaste com te6fRR 完整源码 var evt document createEvent HTMLEvents evt initEvent click
  • Automapper:使用自定义解析器返回的结构

    对于 AutoMapper 我使用 ValueResolver 返回这样的结构 struct MyStruct public int propA public int propB public int propC class MyResol
  • 当 UITableViewCell 被选中时,你能用动画来改变高度吗?

    我正在使用一个UITableView在我的 iPhone 应用程序中 我有一个属于某个组的人员列表 我希望当用户单击特定的人 从而选择单元格 时 单元格的高度会增加以显示几个用于编辑该人的属性的 UI 控件 这可能吗 我发现了一个非常简单的
  • Java 接口...动态内存还是静态内存?

    java接口驻留在内存中的哪里 它们驻留在堆或堆栈中 还是全局内存中 我认为它们在堆栈中 因为它们是在编译时创建的 我对么 类定义 包括接口和抽象类 保存在 PermGen 空间中 这意味着它们永远不会被垃圾回收 iirc 永久代是堆的一部
  • 添加导航栏后 TabLayout 不显示选项卡

    我正在使用 ViewPager TabLayout 它工作正常 但在我添加导航栏后 TabLayout 不显示选项卡 我寻找解决方案 但没有一个有帮助 如果有人告诉我为什么会发生这种情况 那将会非常有帮助 MainActivity java
  • 在 es5 中创建 Angular 2 服务

    我试图在 Angular 2 中创建自定义服务 但我似乎无法在 es5 中找到有关 Angular 2 服务的任何文档 这是我编写代码的内容 我尝试过使用这个 function app app database ng core Inject
  • 将 GTK python 脚本转换为 C

    以下脚本将在 Gnome 桌面上截取屏幕截图 import gtk gdk w gtk gdk get default root window sz w get size pb gtk gdk Pixbuf gtk gdk COLORSPA
  • Workday Soap API - 用户名/密码

    我正在尝试调用 Workday Integration API 我能够连接 但收到无效的用户名或密码消息 我的问题是 我将该信息放在哪里 我在 wsdl 中没有看到任何可以放置用户名或密码的内容 启动 集成 谢谢你的帮助 沃伦 由于某种原因
  • 使用 Python 和 Tkinter 制作一个简单的 GUI,我将无法识别的选择器发送到实例

    我正在尝试学习如何用Python 制作GUI 程序 我正在使用Python 2 7 6 以下是带有标签的简单窗口的代码 from Tkinter import root Tk label Label root text hello labe
  • 如何使用fgets逐行读取文件

    我是编程新手 所以有一些基础知识和常识我不知道 我有一个关于如何正确使用 fgets 的问题 根据 fgets 的解释 似乎 fgets 每当读取 n 1 个字符 遇到 EOF 或遇到换行符时就应该停止 例如 我创建一个如下所示的文本文件
  • 如何批量处理 PySpark DataFrame 中的项目

    我有一个 PySpark 数据框 对于每条 批次 记录 我想调用一个 API 所以基本上说我有 100000k 条记录 我想将项目批量分成 1000 条组并调用 API 我如何使用 PySpark 做到这一点 进行批处理的原因是 API 可
  • 有没有办法通过将引用计数存储在受控对象内来提高shared_ptr的效率?

    这正在成为我的代码中的常见模式 因为当我需要管理一个不可复制的对象时 因为 A 它是 重 或 B 它是操作系统资源 例如关键部分 class Resource class Implementation public boost noncop