繁体   English   中英

分配std :: shared_ptr的集合以进行缓存

[英]Allocating a collection of std::shared_ptr's for caching

我有一个元素列表std::vector<Foo> ,我需要将其转换为std::shared_ptr<Foo>的列表:

auto make_shared(const std::vector<Foo>& foos)
{
    std::vector<std::shared_ptr<Foo>> result(foos.size());
    std::transform(std::begin(foos), std::cend(foos), std::begin(result), 
                   [] (const Foo& foo) { return std::make_shared<Foo>(foo); });
    return result;
}

稍后,我使用std::unordered_map在缓存中使用指向元素的地址。 我发现访问该映射的std::vector很大,并且想知道是否可以用std::vector替换它,因为我知道在第一次缓存查找之前所有元素的地址:

auto complex_calculation(const Foo& foo)
{
    const auto idx = std::distance(first_foo_ptr_, std::addressof(foo));
    // lookup idx in std::vector...
}

据我所知,这样做有两个问题:

  1. 元素在内存中的位置可能并不彼此靠近,这意味着std::vector的大小可能非常大。 这可能吗
  2. operator< (或std::less )不适合根据地址顺序计算偏移量。

在这种情况下是否可以使用自定义分配器来解决这两个问题?

如您所述,std :: vector不会为您节省任何费用(作为固定时间的查找),因为vector的大小必须是整个可寻址内存空间(或至少是堆)的大小。

我将重点放在用例上:您是否要查找包含Foo或其他内容的shared_ptr实例的地址? 在前一种情况下,我将研究shared_from_this,以获得可能的简单解决方案。 在后一种情况下,您需要考虑其他设计选项(例如:如果要在shared_ptr中查找“等效” Foo,请考虑使用ID方法和std :: map查找或等效方法)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM