enable_shared_from_this和make_shared是否提供相同的优化
Does enable_shared_from_this and make_shared provide the same optimization
据我了解make_shared<T>(...)
可以提供一些内存分配优化(它可以在与类 T 实例相同的内存块内分配参考计数器)。
enable_shared_from_this是否提供相同的优化?所以:
class T : std::enable_shared_from_this<T> {};
...
auto t = std::shared_ptr<T>(new T);
与以下相同:
class T {};
...
auto t = std::make_shared<T>();
如果不考虑大小(T)。
enable_shared_from_this是否提供相同的优化?所以:
不。从标准中的措辞可以看出,enable_shared_from_this<T>
有一个weak_ptr<T>
数据成员。这会向类添加一个weak_ptr<T>
,该类具有指向包含引用计数的控制块的指针。它不直接包含引用计数。包含引用计数的控制块仍然存在于对象外部。
包含引用计数的控制块必须比对象存活,以便用于引用该对象的其他weak_ptr
对象仍然可以访问控制块,以检查它是否已过期。
如果控制块在对象内部,则当对象被销毁时,它将被销毁,并且悬空weak_ptr
无法安全地确定对象是否已过期。从理论上讲,控制块的内存可以保持分配状态并且仍然被使用,并且引用计数会更新,即使它们所属的对象被销毁了,但这似乎很丑陋(这意味着该对象不会被delete
销毁,它需要一个显式析构函数调用和显式operator delete
调用来释放内存)。
如果使用自定义删除器或自定义分配器创建拥有shared_ptr
,则也不能使用嵌入式控制块,因为这些对象的大小事先无法知道。在这种情况下,除了嵌入在enable_shared_from_this<T>
基类中的控制块之外,您还需要分配一个外部控制块,从而浪费更多空间。
相关文章:
- 空基优化子对象的地址
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 返回值优化:显式移动还是隐式
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 纯函数,为什么没有优化
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 如何以优化的方式同时迭代两个间距不相等的数组
- 小字符串优化(调试与发布模式)
- 浮点定向舍入和优化
- Visual Studio 调试优化如何工作?
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 线性优化目标函数中的绝对值
- GCC 会优化内联访问器吗?
- gcc 如何优化此循环?
- 如何防止 CUDA-GDB 中的<优化输出>值
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 使用 std::p air 进行返回值优化