为缓存分配std :: shared_ptr的集合

时间:2017-03-18 16:49:41

标签: c++ c++11 memory-management shared-ptr

我有一个元素列表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替换它,因为我知道在第一次缓存查找之前所有元素的地址:

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)不适合根据地址顺序计算偏移量。
  3. 在这种情况下是否可以使用自定义分配器来解决这两个问题?

1 个答案:

答案 0 :(得分:0)

正如您所注意到的,std :: vector不会保存任何内容(作为固定时间查找),因为向量的大小需要是整个可寻址内存空间(或至少是堆)的大小)。

我专注于用例:你是否试图找到包含Foo或其他东西的shared_ptr实例的地址?在前一种情况下,我会研究shared_from_this,以获得一个可能的简单解决方案。在后一种情况下,您需要考虑其他设计选项(例如:如果您正在查找shared_ptr以获取“等效”Foo,请考虑使用ID方法,以及std :: map查找或等效项。) p>