gpt4 book ai didi

c++ - 关于共享内存中 C++ 容器类的快速设计问题

转载 作者:太空狗 更新时间:2023-10-29 21:30:36 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

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

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

关于c++ - 关于共享内存中 C++ 容器类的快速设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2459607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com