如何从使用 mmap 创建的内存块构造 std::vector<boost::dynamic_bitset<X>> 而无需复制

问题描述 投票:0回答:1

我们正在使用 boost::dynamic_bitset。我们正在寻找从使用 mmap 创建的内存块(无需复制)构造 std::vectorboost::dynamic_bitset 的方法。类似地,我们想从 std::vectorboost::dynamic_bitset 获取 uint_8 * 的内存缓冲区

c++ boost
1个回答
0
投票

动态位集,顾名思义,明确是关于管理自己的分配的位集。

但是,由于它是分配器感知的,您可以让它从共享内存中分配。例如。使用 boost 进程间:

住在Coliru

#include <boost/dynamic_bitset.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
namespace bip = boost::interprocess;

namespace Shared {
    using Segment = bip::managed_shared_memory;
    // using Segment = bip::managed_mapped_file; // for COLIRU
    using Mgr     = Segment::segment_manager;

    template <typename T> using Alloc = bip::allocator<T, Mgr>;
    using BS                          = boost::dynamic_bitset<uint32_t, Alloc<uint32_t>>;
} // namespace Shared

#include <iostream>
#include <random>
static std::mt19937 prng{std::random_device{}()};

int main() {
    using namespace Shared;
    Segment shm(bip::open_or_create, "shared-demo", 10 << 10ull);
    BS&     bits = *shm.find_or_construct<BS>("bitset")(888, 0, shm.get_segment_manager());

    std::cout << "Bitset " << bits.count() << " / " << bits.size() << " set\n";
    auto dist = bind(std::uniform_int_distribution<int>(0, bits.size() - 1), ref(prng));

    for (auto i = 0; i < 10; ++i) { bits.set(dist()); }
    for (auto i = 0; i < 10; ++i) { bits.reset(dist()); }
}

重复运行表明它是如何持久的:

我将把进程间同步(如果需要)作为读者的练习。另外,如果您必须从非托管段进行映射,您可以使用

managed_external_buffer
。我在这个网站上有这两种技术的示例。

© www.soinside.com 2019 - 2024. All rights reserved.