【发布时间】: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