【发布时间】:2012-10-11 11:45:36
【问题描述】:
我读到here:
make_shared (在实践中)更有效,因为它分配 参考控制块与实际对象合二为一 动态分配。相比之下,shared_ptr 的构造函数 需要一个裸对象指针必须分配另一个动态变量 参考计数
这是否意味着使用 std::make_shared 创建的 std::shared_ptr 向量将是 “缓存友好”,因为数据(控制块和实际指针的数据)在一个块中?
我的用例是一个包含 100 000 个共享指针的向量,其中指向的对象是 14 个字节。
【问题讨论】:
-
目前尚不清楚缓存是否更友好。如果你经常只对共享指针而不是它们指向的对象进行操作(例如,复制向量,从而增加每个共享指针的引用计数),单独的分配将更加缓存友好。
-
@DavidSchwartz 是否。如果
shared_ptr正在为计数器使用池分配器,那么在仅操作指针的算法中肯定会有缓存获胜。如果没有,根据全局分配器使用的算法,您最终可能会得到与make_shared完全相同的内存顺序,只是分散一点,因为分配器需要额外的管理信息来进行更多单独的分配. -
@James:你知道吗,在实践中使用什么样的池分配器
shared_ptr实现?控制块的大小不是取决于删除器的类型,所以不像对所有东西都使用固定大小那么简单? -
@SteveJessop 我从未看过。删除器的影响是正确的,但是使用默认删除器时使用池会相当简单,否则使用通常的
new。
标签: c++ caching boost stl make-shared