【问题标题】:Storing contiguous bytes of a POD type in boost interprocess在 boost 进程中存储 POD 类型的连续字节
【发布时间】:2022-11-03 23:56:58
【问题描述】:

我正在尝试创建一个 POD 结构类型并将该结构的向量保存在 boost 进程间共享内存中。我一直在做什么,它一直在工作:

template <typename T>
    using Alloc = ipc::allocator<T, ipc::managed_shared_memory::segment_manager>;
using String = ipc::basic_string<char, std::char_traits<char>, Alloc<char>>;

struct SharedData
{
    template <typename Alloc>
    SharedData(size_t aSize, std::string_view aStr, Alloc alloc) : sz(aSize), data(aStr, alloc) {}

    size_t  sz;
    String  data;
};

我继续创建这个结构的向量,它很酷并且可以工作,但是我想在访问向量的第 i 个索引时获得缓存位置。为此,我想将data 存在于向量的同一连续存储中,因此我将结构更改为:

struct SharedData
{           
    SharedData(size_t aSize) : sz(aSize) {}
    size_t  sz;
    char data[MAX_DATA_SIZE];
};

但这并没有在向量中分配,当我使用以下方法创建它时:

auto shared_vec = segment_.construct<Vector<SharedData>>((const char *) shared_vec_name.c_str())(segment_.get_segment_manager());
for (int i = 0; i < vector_size; i++)
    (*shared_vec).emplace_back(max_data_size);

它抛出:

terminate called after throwing an instance of 'boost::interprocess::bad_alloc'
  what():  boost::interprocess::bad_alloc

知道我在这里做错了什么吗?我也想分配一个具有缓存局部性的 POD 类型的向量,因为 String 将具有进一步的动态分配,这对于我的用例来说是不可取的。

【问题讨论】:

    标签: c++ boost shared-memory boost-interprocess


    【解决方案1】:

    char data[MAX_DATA_SIZE]; 使 sizeof(SharedData) 更大。根据分配模式,向量可能会保留或重新分配段中空间不足的情况。

    请注意,许多字符串实现都有SSO,这意味着您可能已经拥有缓存位置。

    如果您真的在努力获取 POD 数据和完整的缓存控制,我建议您切换到类似的东西

     std::array<SharedData, N> instead_of_vector;
    

    对于一些固定容量N。在这种情况下,您不需要托管段,因此请考虑直接使用boost::interprocess::mappped_region 而不是managed_shared_memory

    请注意,两者之间也有很多方法。想到boost::static_vector boost::small_vector。另外,请考虑**简单地预先做一个.reserve() 可能会解决您的问题:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2021-06-08
      相关资源
      最近更新 更多