...使用しているようです:
::: <stl/_alloc.h>
...
enum { _MAX_BYTES = 32 * sizeof(void*) };
...
::: <deque>
...
static size_t _S_buffer_size()
{
const size_t blocksize = _MAX_BYTES;
return (sizeof(_Tp) < blocksize ? (blocksize / sizeof(_Tp)) : 1);
}
つまり、32 x 4 = 32ビットで128バイトのブロックサイズ、32 x 8=64ビットで256バイトのブロックサイズになります。
私の考え:サイズオーバーヘッドPOVから、任意の実装が可変長ブロックで動作することは理にかなっていると思いますが、これは、の一定時間のランダムアクセス要件で正しく行うのは非常に難しいと思いますdeque
。
質問は
STLでは、コードを変更せずに、コンパイル時にこのブロックサイズをオーバーライドできますか?
ここでも不可能です。
(Rogue Wave STLバージョンのようです)明らかに以下を使用します:
static size_type _C_bufsize () {
// deque only uses __rw_new_capacity to retrieve the minimum
// allocation amount; this may be specialized to provide a
// customized minimum amount
typedef deque<_TypeT, _Allocator> _RWDeque;
return _RWSTD_NEW_CAPACITY (_RWDeque, (const _RWDeque*)0, 0);
}
したがって、特殊化によってブロックサイズをオーバーライドするメカニズムがあるようで、...の定義は次のようになります。
// returns a suggested new capacity for a container needing more space
template <class _Container>
inline _RWSTD_CONTAINER_SIZE_TYPE
__rw_new_capacity (_RWSTD_CONTAINER_SIZE_TYPE __size, const _Container*)
{
typedef _RWSTD_CONTAINER_SIZE_TYPE _RWSizeT;
const _RWSizeT __ratio = _RWSizeT ( (_RWSTD_NEW_CAPACITY_RATIO << 10)
/ _RWSTD_RATIO_DIVIDER);
const _RWSizeT __cap = (__size >> 10) * __ratio
+ (((__size & 0x3ff) * __ratio) >> 10);
return (__size += _RWSTD_MINIMUM_NEW_CAPACITY) > __cap ? __size : __cap;
}
だから、それは、えーと、複雑だと思います。
(誰かがこれをさらに理解したいと思う場合は、私の答えを直接編集するか、コメントを残してください。)