c++ - 使用 std::make_shared() 的数据缓存影响

标签 c++ caching boost stl make-shared

我读了here那:

make_shared is (in practice) more efficient, because it allocates the reference control block together with the actual object in one single dynamic allocation. By contrast, the constructor for shared_ptr that takes a naked object pointer must allocate another dynamic variable for the reference count

这是否意味着使用 std::make_shared 创建的 std::shared_ptr vector 将是 “缓存友好”,因为数据(控制 block 和实际指针的数据)在一个 block 中?

我的用例是一个包含 100 000 个共享指针的 vector ,其中对象指向的是 14 个字节。

最佳答案

也许吧,但不要指望它。

为了缓存友好,您希望使用尽可能少的内存,并且您希望在地址上靠得很近的操作在时间上也靠得很近(也就是说,足够接近以至于第二个操作使用的内存仍然是从第一个操作的效果来看,在某种级别的缓存中:缓存级别越低越好)。

如果您使用 make_shared,那么总内存使用可能会略有节省,无论您使用什么,这至少往往是缓存的胜利内存使用模式。

如果使用make_shared,那么控制 block 和引用对象(referand)在内存中将是相邻的。

如果您使用make_shared,并且您的对象与您的控制 block 大小不同,那么使用公共(public)内存分配器,对象很有可能会聚集在一个地方,控制 block 聚集在另一个地方。如果它们相同的大小(一旦被内存分配器以某种特定于实现的方式四舍五入),那么对于通用内存分配器,它们很可能会在长时间运行时交替使用内存,除非 shared_ptr 做了一些事情来影响它。

您的内存访问模式将决定哪些布局更适合缓存——当然,您在非make_shared 情况下获得的实际布局可能又是另外一种布局,具体取决于实现详情。

您拥有一个 vector 的事实基本上与所有这些无关,因为 shared_ptr 对象与控制 block 和引用对象是分开的。

关于c++ - 使用 std::make_shared() 的数据缓存影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12838787/

相关文章:

c++ - 如何合并/更新 boost::property_tree::ptree?

c++ - 循环依赖(类a typedef,类中的typedef),前向声明给出模棱两可的调用?

android - 缓存 Json/Rest 网络响应

linux - Linux 内核中 slab 内存管理的缓存着色

Android WebView 在缓存路径中下载图片

c++ - 将 8/17/2003 转换为 boost::gregorian::date

c++ - 在 N 个未排序的数字中搜索给定值的最佳方法

c++ - 如何在 Mac OS X C++ 程序中记录时间戳?

c++ - 具有模板化成员函数的类,是同一个类吗?

c++ - 如何每次使用不同的参数多次测试方法