memory - 带有 STL 向量的 shm_open 和 mmap

标签 memory vector mapping posix shared

我读到 STL 向量不能很好地与 SYS V 共享内存一起工作。但是,如果我使用 POSIX shm_open,然后将 mmap 与 NULL (mmap(NULL, LARGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)向量,除了超过 LARGE_SIZE 空间之外还有其他问题吗?其他相关问题:在最近的 SUSE linux 上是否保证在不相关的进程中映射到相同的起始地址(使用上述语法)时,我的对象将被直接映射并且没有执行(系统)复制来实现进程中更改的值(就像 mmap-ed 时正常打开和正常文件会发生什么)? 谢谢!

编辑: 那么这是正确的吗?:

void* mem = allocate_memory_with_mmap(); // say from a shared region
MyType* ptr = new ( mem ) MyType( args );
ptr.~MyType() //is this really needed?

现在在一个不相关的过程中:

MyType* myptr = (MyType*)fetch_address_from_mmap(...)
myptr->printHelloWorld();
myptr->myvalue = 1; //writes to shared memory
myptr.~MyType() //is this really needed?

现在如果我想释放内存

munmap(address...) //but this done only once, when none of the processes use it any more

最佳答案

您忽略了一个事实,即 STL 向量通常只是 (内存指针、内存大小、元素计数) 的元组,其中包含的对象的实际内存是从 allocator 接收的。模板参数。

std::vector 的实例放在共享内存中没有任何意义。您可能想查看 boost::interprocess取而代之的是图书馆。

编辑0:

内存分配和对象构建是两个截然不同的阶段,尽管像下面这样组合在一个语句中(除非运算符 newMyType 重新定义):

// allocates from process heap and constructs
MyType* ptr = new MyType( args );

您可以使用 placement new 拆分这两个阶段:

void* mem = allocate_memory_somehow(); // say from a shared region
MyType* ptr = new ( mem ) MyType( args );

尽管现在您必须显式调用析构函数并释放内存:

ptr->~MyType();
release_memory_back_to_where_it_came_from( ptr );

这基本上就是您在 C++ 中的共享内存中构造对象的方式。请注意,存储指针的类型不适合共享内存,因为一个进程内存空间中的任何指针在另一个进程内存空间中都没有任何意义。请改用明确的大小和偏移量。

希望这对您有所帮助。

关于memory - 带有 STL 向量的 shm_open 和 mmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12603876/

相关文章:

node.js - 上传图片时 Nodejs 内存填得太快~10MB

c++ - 标准容器作为多线程应用程序中的局部变量

c++ - 将派生类列表传递给需要 C++ 中基类列表的函数

java - java对象到对象映射的任何工具?

python - 如何快速估计两个(纬度、经度)点之间的距离?

entity-framework - Entity Framework : Mapped multiple Tables into one Entity -Insert problems

java - 这些 jvmFlags 是否指定堆不应超过 256MB 或者至少应为 256MB?

c - 从创建/修改 malloc realloc 的内存块中读取值?

c# - C# 中的 C 回调函数问题 - 如何将值传递给指针?

c++ - 在 list<int> 或 vector<int> 中添加备用数字