How much memory should #39;managed_shared_memory#39; allocate? (boost)(管理共享内存应该分配多少内存?(助推))
问题描述
我正在寻找一个明确的答案(如果确实存在的话),即在通过boost::interprocess
的managed_shared_memory
创建静态共享内存块时,应该分配多少内存。甚至official examples似乎也分配了arbitrarily large内存块。
考虑以下结构:
// Example: simple struct with two 4-byte fields
struct Point2D {
int x, y;
};
我最初的反应是必要的大小应该是8个字节,或sizeof(Point2D)
。当我尝试构造一个对象时,这个操作失败得很惨,在运行时出现了seg错误。
// BAD: 8 bytes is nowhere near enough memory allocated.
managed_shared_memory segment(create_only, "My shared memory", sizeof(Point2D));
什么读/写操作导致SEG-FAULTS?堆栈操作?是否在segment.construct()
内临时分配?分配共享内存时需要多少开销?
通过反复试验,我发现将大小乘以4可以适用于上面的结构,但当我开始向struct
添加更多字段时,它就失效了。所以,这是一次糟糕的黑客攻击。
有些人可能会争辩说,现代PC中的"内存很便宜",但我不同意这种理念,如果我能避免的话,我不喜欢分配超过我需要的内存。我昨天翻遍了Boost的文档,但没有找到任何建议。为今天学习新东西干杯!
推荐答案
来自文档的this paragraph:
内存算法是一个对象,它 被放在 共享内存/内存映射文件 段。
内存段布局:
____________ __________ ____________________________________________
| | | |
| memory | reserved | The memory algorithm will return portions |
| algorithm | | of the rest of the segment. |
|____________|__________|____________________________________________|
库在段的开头有额外的内存开销,因此占用了您请求的大小的几个字节。根据this post和this post,无法确定确切的额外字节数:
您无法计算它,因为有 是内存分配Booking和 中更改的碎片化问题 运行时取决于您的 分配/解除分配模式。和 共享内存按页分配 通过操作系统(在Linux 64k上为4K,在 Windows),因此任何分配都将 实际上,将四舍五入分配到 页面:managed_shared_memory segment(create_only, "name", 20);
将浪费与以下相同的内存:
managed_shared_memory segment(create_only, "name", 4096);
这篇关于管理共享内存应该分配多少内存?(助推)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:管理共享内存应该分配多少内存?(助推)
基础教程推荐
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++,'if' 表达式中的变量声明 2021-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01