Memory consumption of a boost ptr_map of class A as key and vectors of pointers as value B
作为昨天发布的一个后续问题,指针指向指针向量的指针的内存消耗,我还有一个关于键类型为的boost ptr_映射的内存使用的问题,例如,类A(现在假定为int),值是某个类型指针的(指针指向)向量(再次假定为int),这是一个ptr_映射。我读过这个问题,如何估计std::map的内存使用情况?STL映射的内存消耗通常是
1
| (sizeof(A) + sizeof(B) + ELEMENT_OVERHEAD) * N + CONTAINER_OVERHEAD |
我的问题是这样一个设计的元素开销有多大,相对于
假设类型A和B(这里假设为int,而B是指向int的指针向量的指针),我想,即使是对于通常的STL映射的答案也会有所帮助。另外,我想知道如果可能的话,如果a更复杂的话,事情是如何变化的,我猜元素开销也会随着a的复杂性而增长?元素开销是否由A和B大小之和的某个分数所限定?我担心的是,如果元素开销很大一部分不是真正有界的,那么使用映射的整个点就不再有吸引力了。
- 这些日常开支通常是恒定的,独立于键和值。
- 谢谢。。但是,与sizeof(int)相比,您知道元素开销有多大吗(我不关心容器开销)?这乘以n,所以如果n很大,它就很重要。
- 与任何大小的向量使用的内存相比都很小。
费尔南德斯说,在AS Martinho Comment is for each item量图等。
图overheads for some items of后一般implementations标准探究:
P></
- 4.4.3顾客:3分和一个类型的成员节点for each
- 其中+ + + +其中:2008年、2010年三分球和字符串成员节点2 for each
- 3分:1 stlport 5.2.1 for each bool和成员节点
4.4.3顾客,其中2008年+ + +,其中2010年和stlport 5.2.1使用红-黑树映射到实施"订单。P></
- 真的。。因此,只需根据你所说的,假设一张大小为5000万的Int地图作为键。由于指针的大小是固定的,并且假设内容指向已经在全局范围内的内容,那么所消耗的内存至少是(8+8+4*8+枚举大小)*5000万字节?我很震惊。
- @你认为你的5000万向量使用了多少空间?
- 我的向量是指针的向量,每个指针指向全局范围内的数据。(所以本身没有额外的内存),加上这些向量通常都是6号的(所以指向内存中已经存在的数据的6个指针)。既然地图的值是指向这样一个向量的指针。我有8个(int键)+8个(指向vec的指针)+4*8个(基于vnm的注释)+枚举大小/等。天哪,这太令人沮丧了!希望头顶能有8+8的小部分。
- @你什么意思??我刚刚向您展示了与每个项目相关联的开销大于项目本身(假设是一个标准的64位系统)。
- @被压扁了。这是一个过时的评论,对不起)
- @你确定这个信息吗?我觉得挺陡的。但如果这是事实,是否有任何低内存的替代方案具有STL映射的优势?
- @squaked.bugaboo您对容器有相当严格的要求,所以std::map可能不太适合您的任务?首先,你可以考虑使用无序的地图。(我不确定,但我假设它的开销更少)。
- @squazed.bugaboo"你确定这个信息吗?"std::map的底层数据结构通常是红黑二叉树,因此我们需要为每个节点的子级提供两个指针。msvc和gcc都添加了指向父节点到节点的指针。红色或黑色指示的加号。因此,每个节点都有3个指针和一个枚举类型成员。
- 让我们在聊天中继续讨论
- @squaked.bugaboo std::map是一个漂亮的"重功能"容器:它为元素排序+它具有不因更改映射数据而使迭代器无效的属性,因此它的所有开销可能都是为其目的服务的…但我不是这方面的专家,所以我想最好还是等其他人回答这个问题…