【发布时间】:2017-07-14 08:46:18
【问题描述】:
我已经用 (int, string) 声明了一个地图对象。字符串大小为 128 字节。但是,新的 Map 节点大小保持不变,为 48 字节。我已经通过自定义分配检查了这一点。
std::map<int, std::string, std::less<int>, my_allocator< std::pair<const int, std::string> > > custom_map;
gen_random(random_string, 103); //generates a random string of size 103 and stored in random_string
custom_map.emplace(i, std::string(random_string)); //allocates 48 bytes for map
/* the string is allocated separately */
我的问题是 - 地图节点包含什么? (我假设基于上述代码的行为,红黑树的一些元数据、键和指向值的指针都保存在映射节点中。)
动机:
我有一个管理持久内存的内核模块。它通过将持久内存映射到应用程序地址空间来使应用程序可以访问它们。它还支持原子 msync。
我正在尝试使用 C++ STL 映射开发一个简单的持久键值存储。因此,我尝试创建一个自定义分配器来从持久内存中分配 stl::map 对象。我有一个从持久内存设备映射的内存池,由自定义分配器使用。所以我需要确保与 MAP 相关的所有内容(键、值、内部节点)都是从该池中分配的。
当我看到 Map 对象/节点大小小于 (int, string) 对大小时,我感到困惑,因为我假设所有内容(键+值)都将包含在使用自定义分配器分配的映射节点内.然而,事实并非如此。所以我需要了解 MAP 节点设置,以保证与 Map 对象相关的所有内容(不多或少)都是从持久内存池中分配的。
我希望它能清除动机。任何建议都受到高度赞赏。
【问题讨论】:
-
一个字符串不可能有大小,正如 sizeof 所报告的那样。 128 字节 - 更可能是 12 字节。
-
我猜这主要取决于实现。顺便说一句,std::string 是固定大小的,它包含一个指向动态分配的 char 数组的指针。
-
你会对
cout << sizeof(std::string(random_string)) << endl;的输出感到惊讶,但如果你考虑一下就明白了。 -
谢谢! @PeterLenkefi。现在更有意义了。
std::string s = "Test";分配 29 个字节。所以,我猜字符串对象是 24 个字节,char 数组是 5 个字节。
标签: c++ dictionary stl dynamic-allocation