Почему я получил de_max_size () меньше, чем vector max_size ()?

Во время обучения (& экспериментируя) с контейнерами STL, я обнаружил, что вектор max_size = 4611686018427387903 и deque max_size = 2305843009213693951 в моей системе (версия gcc 4.7.2, x86_64). Из моего (ограниченного) понимания запросы обычно реализуются внутренне как список векторов (или вектор векторов?). Если это так, то почему max_size deque меньше, чем у вектора, который (vector) фактически потребовал бы непрерывный блок памяти, и deque может работать с несколькими смежными блоками? Это как-то связано с конфигурацией моей системы, текущим состоянием или так и должно быть?

1

Решение

Мне не хватает одной детали в вашем вопросе: с какими типами вы тестировали max_sizes? Gcc 4.7.2 от Ideone (на 32-битной версии) говорит, что оба имеют одинаковый max_size — если дан тот же тип элемента. Для его инт 2^30-1 — что означает максимальный размер хранимых данных (2^32 - 4) байт, так как sizeof(int) == 4 в этой системе.

Это дикая догадка: сравнивали ли вы vector<T>::max_size против deque<U>::max_size с sizeof(T) == 4 а также sizeof(U) == 8? это объясняет приблизительный фактор 2.

Как бы то ни было, ваш эксперимент показывает, что max_size возвращает только очень теоретическое число, поскольку вы, конечно, не можете получить 2^62-1 вставляет в память. -1 вытекает из того факта, что «первые» 4 байта должны быть оставлены пустыми, иначе &vec[0] == NULL, Вы не могли бы иметь никаких других данных в этой программе, кроме целых чисел, хранящихся в векторе — включая сам вектор!

1

Другие решения

Как вы могли заметить, 4611686018427387903 2^62 - 1 и 2305843009213693951 является 2^61 - 1, который должен дать вам подсказку, откуда взялись эти цифры (подсказка: ничего общего с конфигурацией вашей системы).

Я не знаю реальной причины, но я предполагаю, что это очень академично и не имеет ничего общего с тем, как реализованы векторы или запросы. Возможно, deque GCC использует дополнительный бит, чтобы отслеживать что-то еще. Кто-то, знакомый с GCC, вероятно, может позвонить сюда. Во всяком случае, языковой стандарт ничего не говорит о том, что max_size должно быть, так что это полностью зависит от реализации библиотеки / компилятора.

Эти цифры очень велики, и на практике вы увидите, как другие вещи взрываются, прежде чем подойти max_size, Возможно, есть дурацкие реализации STL, где max_size очень маленький, но по крайней мере для GCC вам не нужно беспокоиться об этом.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector