... кажется до использовать :
::: <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 = 128 байт в 32-разрядном, а размер блока 32 x 8 = 256 байт в 64-разрядном
Мое мнение: Исходя из 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;
}
Так что я бы сказал, ах, сложно.
(Если кому-то захочется выяснить это дальше, смело редактируйте мой ответ напрямую или просто оставьте комментарий.)