【发布时间】:2010-11-04 14:35:50
【问题描述】:
关注What the heque is going on with the memory overhead of std::deque?
Visual C++ 使用以下方法根据容器元素类型管理 deque 块:
#define _DEQUESIZ (sizeof (value_type) <= 1 ? 16 \
: sizeof (value_type) <= 2 ? 8 \
: sizeof (value_type) <= 4 ? 4 \
: sizeof (value_type) <= 8 ? 2 \
: 1) /* elements per block (a power of 2) */
这会导致小元素占用非常大的内存。通过将第一行中的 16 更改为 128,我能够大大减少大型 deque<char> 所需的占用空间。 Process Explorer Private Bytes 在 100m push_back(const char& mychar) 调用后从 181MB -> 113MB 下降)。
- 任何人都可以证明
那个
#define? - 其他的怎么办
编译器处理
deque块 浆纱? - 他们的足迹是什么
(32位操作)为简单
测试 100m
push_back调用deque<char>? - STL 是否允许
覆盖此块大小
编译时,无需修改
<deque>代码?
【问题讨论】:
-
你不能写一个自定义分配器来分配更大的块吗?
-
@Space_C0wb0y - 是的,尽管我认为这是不鼓励的(Meyers 等人)。
-
@Space_C0wb0y - 自定义分配器可能会有所帮助,但不能完全解决这个问题。尽管如此,每个双端队列块中都会有双端队列的变量,因此无论如何都会有开销。
-
@valdo - 不仅是每个块的信息,还有每个块的堆管理器信息。对于
deque<char>,开销几乎与成员存储相同。他们为什么要这样做? -
@Steve:“他们为什么要这样做?” - 我能想到的第一个答案是 MS/Dinkumware 并没有真正考虑在这方面优化
deque。从 GCC 源 @AProgrammer 引用中的评论来看,GNU 也没有,它只是拥有一个更适合大型deques的常量。创建 10m 双端队列,每个队列包含 10 个字符,突然间,Visual C++ 是天才,而 GCC 是拥有 5000% 开销的坏人。大概可以实现一个deque,从小块开始,然后增加块大小。
标签: c++ memory-management deque