gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:30:36 24 4
gpt4 key购买 nike

我读了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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com