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);
这篇关于管理共享内存应该分配多少内存?(助推)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:管理共享内存应该分配多少内存?(助推)
基础教程推荐
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- CString 到 char* 2021-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- 初始化列表*参数*评估顺序 2021-01-01
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
