c++ - 替换共享指针的内容时优化对分配器的调用

标签 c++ smart-pointers

考虑这个程序:

#include <memory>

struct T {
    T() {}
};

void do_something(std::shared_ptr<T> ptr) {
    // Do something with ptr; might or might not leave
    // other copies of ptr in other variables of the
    // program
}

int main() {
    std::shared_ptr<T> ptr = std::make_shared();
    do_something(ptr);
    // ptr might or might not be the only owner
    ptr = std::make_shared();
    return 0;
}

make_shared第二次执行,ptr可能有也可能有其他共享所有者,这取决于运行时在 do_something 中发生的情况.如果没有其他人,ptr当或多或少同时分配和构造同一时间的新对象时,破坏并释放其先前拥有的对象。有没有办法避免分配和释放,并使用相同的区域来构造新对象? (这里的目标是优化对分配器的两次调用)

当然我接受新的T object 将在旧的对象被破坏之后构造,而在上面的代码中恰恰相反。所以我想要类似 ptr.replace<U>(args) 的东西它执行以下操作:它递减 ptr的引用计数;如果计数变为零,则没有其他弱引用和 Uptr 内容的最派生类型, 它会破坏拥有的对象并构造一个带有参数 args 的新对象在同一内存区域中,避免调用内存分配器。否则它的行为类似于 ptr = std::make_shared<U>(args) .

有没有办法用当前的标准库进行这种优化?

最佳答案

没有计算共享对象的 weak_ptr 数量的机制。您只能查询强计数(通过 shared_ptr::use_count)。请注意,在多线程环境中,这可以是一个近似计数(即使用 memory_order_relaxed 加载)。

您确定这是性能瓶颈吗?

关于c++ - 替换共享指针的内容时优化对分配器的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55513474/

相关文章:

C++:实现智能指针

c++ - setter 方法中的 make_shared 行为类似于创建拷贝

c++ 替代成员定义

c++ - Qmake 在创建 Visual Studio 项目时不替换环境变量?

c++ - GCC -flto 更改符号可见性

c++ - 在 Windows 中更改 boost 线程优先级

c++ - weak_ptr 是否与 unique_ptr 一起工作?

c++ - 使用 unique_ptr 实例化类集合成员

java - Eclipse 是否有 "vim: set ft=cpp:"或 "-*- c++ -*-"的等价物?

c++ - 具有 shared_ptr vector 的类的析构函数导致错误