关于 boost::interprocess::managed_shared_memory->size 的谜题

A puzzle about boost::interprocess::managed_shared_memory->size

我有两个程序。

#include <iostream>

#include <boost/interprocess/managed_shared_memory.hpp>


int main(int argc, char const* argv[])
{
    boost::interprocess::shared_memory_object::remove("High");
    try {
        boost::interprocess::managed_shared_memory managed_shm(
                boost::interprocess::create_only,
               "High",
                256);
        std::cout << "success" << std::endl;
    }
    catch (boost::interprocess::interprocess_exception &ex) {
        std::cout << ex.what() << std::endl;
    }
    return 0;
}

它打印输出 "boost::interprocess_exception::library_error"

但是将 256 更改为 512,它会打印 "success":

#include <iostream>

#include <boost/interprocess/managed_shared_memory.hpp>


int main(int argc, char const* argv[])
{
    boost::interprocess::shared_memory_object::remove("High");
    try {
        boost::interprocess::managed_shared_memory managed_shm(
                boost::interprocess::create_only,
               "High",
                512);
        std::cout << "success" << std::endl;
    }
    catch (boost::interprocess::interprocess_exception &ex) {
        std::cout << ex.what() << std::endl;
    }
    return 0;
}

256和512有什么区别?

256和512相差256

256 字节对于您系统上的段管理器控制块来说太小(可能是任何 64 位目标)。

开销可能会让您感到惊讶,但它有一点意义,因为涉及 "heap-management"(在 Boost Interprocess 中称为 段管理)。

另见 Bad alloc is thrown:

There's considerable initial overhead, consuming 320 bytes before anything happened.

(它还显示了不同分配schemes/data结构的图表)

如果你想要一个没有段管理的原始共享内存对象,使用shared_memory_object