mar*_*hon 5 c++ boost shared-memory
我正在使用boost :: interprocess :: vector在进程之间共享一些字符串,我想确保不会溢出它所在的共享内存段.
如何找到向量在内存中占用的空间,以及特殊的段分配字符串将占用多少内存?
typedef boost::interprocess::managed_shared_memory::segment_manager SegmentManager;
typedef boost::interprocess::allocator<char, SegmentManager> CharAllocator;
typedef boost::interprocess::basic_string<char, std::char_traits<char>, CharAllocator> ShmString;
typedef boost::interprocess::allocator<ShmString, SegmentManager> StringAllocator;
typedef boost::interprocess::vector<ShmString, StringAllocator> ShmStringVector;
const size_t SEGMENT_SIZE = ...;
addToSharedVector(std::string localString){
using namespace boost::interprocess;
managed_shared_memory segment(open_only, kSharedMemorySegmentName);
ShmStringVector *shmvector = segment.find<ShmStringVector>(kSharedMemoryVectorName).first;
size_t currentVectorSizeInShm = ?????(shmvector); <-------- HALP!
size_t sizeOfNewStringInSharedMemory = ?????(localString); <--------
//shared mutex not shown for clarity
if (currentVectorSizeInShm + sizeOfNewStringInSharedMemory < SEGMENT_SIZE) {
CharAllocator charAllocator(segment.get_segment_manager());
ShmString shmString(charAllocator);
shmFunctionName = localString.c_str();
shmvector->push_back(shmString);
}
}
Run Code Online (Sandbox Code Playgroud)
又快又脏
您可以将共享内存设置为物理映射文件,并查看实际有多少页已提交到磁盘。这为您提供了许多实现的粗略指示,因为页面很可能一次提交 1 个,并且通常的内存页面大小为 4kb。
我有另一个答案[1],它向您展示了此方法的基础知识。
您可以在段管理器上使用 get_free_memory()。请注意,这并没有说明为该向量分配了/只是/什么,但它让您了解(可以说更有用)实际占用了多少空间。
在另一个答案 [2]中,我用它来衡量具有连续存储的数据容器与基于节点的容器之间的内存开销差异。

正如您所看到的,单独的分配具有很高的开销,并且重新分配很快就会导致碎片。所以值得一看
[1] 参见 内存映射文件、托管映射文件和偏移指针
[2] 参见 抛出错误分配