【问题标题】:A quick design question about C++ container classes in shared memory关于共享内存中 C++ 容器类的快速设计问题
【发布时间】:2010-03-17 02:44:10
【问题描述】:

我正在围绕 boost::interprocess 的向量容器编写一个简单的包装器,以在 IPC 的共享内存 (shm) 中实现一个环形缓冲区。假设buf 是在shm 中创建的RingBuffer 的一个实例。现在,在其 ctor 中,buf 本身分配了一个私有的 boost::interprocess::vector 数据成员来存储值,例如m_data。我的问题是:我认为m_data 也应该在共享内存中创建。但这是必需品吗?

如果在 shm 中创建的 buf 分配标准内存,即使用 new,会发生什么情况。这是否在调用进程的堆上分配?我不认为buf 是在那里分配的,那么为什么不在进程堆上的对象私有的数据成员会在那里分配。我很困惑。

【问题讨论】:

    标签: c++ shared-memory


    【解决方案1】:

    boost::interprocess::vector 将分配器类型作为模板参数。这个分配器需要从共享内存中分配(见使用示例)。

    如果您的类使用new 分配内存,那么该内存只能从分配它的进程中访问。这是错误的,这正是boost::interprocess::vector 需要共享内存分配器的原因。

    在它的ctor中,buf本身分配了一个私有的boost::interprocess::vector数据成员

    这对我来说没有意义。在 C++ 中,您不能在构造函数中“分配”数据成员。数据成员在类主体中定义,它们是该类的每个对象的一部分。它们与对象位于同一内存中,原因与 4 字节整数的中间字节与整数位于同一内存中的原因相同。

    为什么不在进程堆上的对象私有的数据成员被分配到那里

    内存按照您的要求分配。如果您使用new 进行分配(并且它没有被重载),那么它会在进程内存中分配。如果您使用共享内存段管理器进行分配(我认为 Boost 就是这么称呼它的——我自己实际上并没有使用过这些 API),它是在共享内存中分配的。包含调用的类以及存储指向已分配内存的指针的数据成员与它无关。

    【讨论】:

    • 感谢史蒂夫,这解决了我的很多困惑。我剩下的问题是:在 shm 中创建的buf 类是否应该使用boost::interprocess::vectorstd::vector 来存储其数据?我觉得应该是boost版本吧,就是想知道对不对。
    • 是的,它必须是进程间。 std::vector 分配内存并存储指向它的指针。默认情况下,它使用new 分配,我们知道这是错误的。但是即使你给std::vector一个从共享内存分配的分配器,它仍然是错误的,因为共享内存可能不会在所有进程中映射到相同的地址范围,如果它不是't 然后指针将不起作用。 boost::interprocess::vector 为您处理。
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    相关资源
    最近更新 更多