在C STL :: MAP内部节点中存储的内容
What is stored in C++ STL::MAP internal node?
我已用(int,string)声明了一个地图对象。字符串大小为128个字节。但是,新的地图节点大小保持恒定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对象。我有一个从持久存储设备映射的内存池,该内存设备由自定义分配器使用。因此,我需要确保从该池分配了与地图(密钥,值,内部节点)相关的所有内容。
当我看到地图对象/节点大小小于(int,字符串)对大小时,我认为所有内容(键 值)将包含在地图节点中,该节点使用自定义分配器分配。但是,事实并非如此。因此,我需要了解地图节点设置,以确保与映射对象相关的所有内容(不多)是从持久的内存池分配的。
我希望它能清除动力。任何建议都得到高度赞赏。
第一件事:std :: string具有固定的大小(实现依赖性)。它通常将指针保存到动态分配的内存(您可以使用C_STR()方法访问)。
其次,未指定地图的内部,它也取决于实现。您可以查看此最少的实现。
c 不支持动态尺寸的结构(如果我错了,请纠正我!),因此每个动态容器都有一个基础指针。
它是实现特定的。您可以Google并找到例如这个。
如果您真的很在乎,请查看源代码(例如GCC及其libstdc++
或Clang及其LIBC )。他们的标准标头(例如<map>
)包括一些特定的内部标题。您可以将-H
(将实际包含的文件打印)传递给g++
(或clang++
),以了解使用了哪些实际内部标头。
也可以查看<string>
。它通常进行小字符串优化。看到这个(和那个)。
在内部,当您启用编译器优化时,可能会发生奇怪的事情(例如,生成向量机器指令或AVX以加快某些字符串操作)。而且内部标头可能会为他们提供技巧。
因此,如果您真的在乎(并假设您使用的是免费软件C 实现,例如GCC或Clang),请潜入实现源代码中。或查看生成的汇编代码(从您的特定源代码),例如用g++ -O -fverbose-asm -S
生成。或查看gimple内部表示(使用g++ -fdump-tree-gimple -O
等...)。
(内部标题可能不包含非常可读的代码,并且可以使用编译器魔术或技巧,但是编译器和标准的C 库实施者 - 实际上,它们是同一团队 - 为了提高效率)
最近C 的利益之一是利用其标准库提供的抽象和可能的优势。那么,为什么要考虑实施详细信息呢?您不能相信实现吗?
(如果您关心实施详细信息,请务必使用-O
或-O2
进行优化,因为编译器正在做很多编译器)
附录,激励之后
请注意,不建议在C 中代码Linux内核模块,尤其是因为 kernel abi和调用约定与GCC的 bernel abi不兼容。有很多虚假性,例如异常(以及生成的代码包含与它们相关的内容)和其他内容。确保查看生成的汇编代码。
(如果您敢在C 中编码内核内容,请注意所有细节,包括调用惯例和内核ABI。这些细节更令人恐惧,并且比更复杂的更复杂只是std::map
的实现)
如果您仅在特定的内核原始图(在C中)上方编码一个用户陆地库,则需要关心诸如ASLR之类的详细信息。也许研究现有的应用程序检查点框架(或持久性实现)可能是鼓舞人心的。垃圾收集有很多概念&amp;术语与您的持续密钥商店共同,因此阅读GC手册应该会有所帮助。
那么,我目前的建议是避免在C 中编码您的内容;您当然应该关心实施细节,而C 在将它们隐藏给您方面做得很好。因此,我觉得您的方法有缺陷,当然很脆!我建议在C中明确编码明确的一些红色树木,而没有任何C ;然后,您将了解每个实施细节
- 如何在pugixml中获取节点的内部XML
- C++ SSE 内部函数:将结果存储在变量中
- 如何告诉本机节点模块所需的dll存储在哪里?
- "std::string"是否将其字符作为签名字符在内部存储?
- 检查BST中每个节点的平衡因子并将其存储在节点中
- 图问题:找出两个节点是否在每个节点的O(1)时间和O(2)存储中共享同一分支
- 如何在 C++11 的内存池中分配 std::map 的内部RB_tree节点?
- C++ :从C++脚本内部触发存储在我机器上的 python 脚本
- C++ 在节点内存储对数据对象的引用,而不复制数据
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 内部字符串/字符如何在 int 和 float 中存储
- 嵌套的C 常数数据结构,没有初始化列表或明确命名所有节点-VC 2012过早破坏了内部元素
- 如何将不同类型的节点存储在一个链接列表中
- 在C STL :: MAP内部节点中存储的内容
- 如何通过队列指针访问存储在节点中的类中的数据
- 在C++中,当两个向量类型不同时,如何将值存储到向量内部的向量中
- 信息实际上并未存储在节点阵列中
- 为什么链表使用指针而不是将节点存储在节点内部
- 使用 get 函数访问存储在节点中的数据
- 存储内部排序映射元素的最快方式