std :: deque内存使用 - Visual C++,以及与其他人的比较

Ste*_*end 18 c++ memory-management deque

跟进std :: deque的内存开销对heque的影响是什么?

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) */
Run Code Online (Sandbox Code Playgroud)

这导致小元件的内存占用非常大.通过将第一行中的16更改为128,我能够大幅减少大型所需的占用空间deque<char>.在100m push_back(const char& mychar)调用后,Process Explorer Private Bytes从181MB减少到> 113MB .

  • 任何人都能证明这些价值#define吗?
  • 其他编译器如何处理deque块大小调整?
  • 对于100m push_back调用 的简单测试,它们的占用空间(32位操作)是deque<char>什么?
  • STL是否允许在编译时覆盖此块大小而不修改 <deque>代码?

APr*_*mer 5

gcc有

return __size < 512 ? size_t(512 / __size) : size_t(1);
Run Code Online (Sandbox Code Playgroud)

评论

/*  The '512' is
 *  tunable (and no other code needs to change), but no investigation has
 *  been done since inheriting the SGI code.
 */
Run Code Online (Sandbox Code Playgroud)

  • @Steve:谢谢,那意味着在GCC中,块的大小约为512字节(如果“ sizeof(_Tp)&lt;512”,则最大,否则为对象的大小)。有趣的是,这并没有随着缓存的增大而发展。当然,此系统有更多潜在的浪费(即,如果双端队列中只有一个`char`,那么您仍有`512`字节块...) (2认同)