Разница в размере между std :: vector и std :: deque

Сразу после объявления vector<int> и deque<int>, если я распечатаю sizeof на обоих из них, std::vector будет иметь 12 байтов (я предполагаю, что начало, конец и размер), а deque - 40 байтов. Откуда берутся эти лишние байты?

Я использую Code::Blocks IDE 13.12 и выбрал используемый C++11 стандарт.


person taigi100    schedule 16.03.2015    source источник
comment
Почему бы не заглянуть внутрь заголовка <deque> вашего компилятора и не узнать?   -  person PaulMcKenzie    schedule 16.03.2015
comment
Хммм ...: ideone.com/LBYvnG   -  person PaulMcKenzie    schedule 16.03.2015
comment
Извините, почему-то упрощен на 4.   -  person taigi100    schedule 16.03.2015
comment
@PaulMcKenzie, потому что содержимое заголовков std многих реализаций - это мерзость, которую ни один смертный не должен заставлять читать.   -  person Yakk - Adam Nevraumont    schedule 16.03.2015
comment
@PaulMcKenzie Я пытаюсь посмотреть на реализацию, но не понимаю разницы :(   -  person taigi100    schedule 16.03.2015
comment
@ user1640736, Если у вас вопрос, как мой компилятор реализует std :: deque ?, вы не предоставили достаточно информации.   -  person ikegami    schedule 16.03.2015


Ответы (3)


Размер зависит от реализации; но неудивительно, что управляющая структура для более сложной структуры, такой как deque, может быть больше, чем простая, например, vector (которой, как вы говорите, легко управлять с помощью трех указателей или указателя и двух размеров).

Если посмотреть на реализацию GNU, то в ней хранятся предварительно вычисленные «начальный» и «конечный» итераторы, предположительно потому, что их трудно вычислить по запросу и легче обновить при изменении контейнера. Каждый из них довольно сложен и содержит четыре указателя: текущую позицию, начало и конец текущего блока и указатель на структуру карты, необходимую для перемещения между блоками. deque также имеет (возможно, избыточный?) Указатель на эту карту и размер (опять же, предположительно, трудно вычислить по запросу), что дает в общей сложности десять указателей / размеров, как вы заметили.

person Mike Seymour    schedule 16.03.2015

Оператор sizeof принимает размер объекта, а не размер его содержимого.

Итак, если у объекта есть три переменные-члены данных, оператор sizeof получит размер этих переменных-членов, но если одна из них является указателем на дополнительные данные, вы получите только размер указателя, а не длину данных, которые он указывает на.

person Some programmer dude    schedule 16.03.2015
comment
Вот о чем я спрашиваю. Почему размер вектора 3 байта, а размер двухсторонней очереди 10 байтов? - person taigi100; 16.03.2015
comment
@ user1640736 Внутренние данные объектов-контейнеров зависят от реализации, спецификация C ++ ничего не говорит о переменных-членах, только о том, как классы должны вести себя. - person Some programmer dude; 16.03.2015
comment
Я попытался посмотреть документацию, попытаться посмотреть на реализацию в данный момент, но я почти ничего не понимаю ... - person taigi100; 16.03.2015
comment
@ user1640736 Не смотреть на реализацию, только читайте документацию (например, ссылка на контейнеры C ++). Реализация на самом деле не предназначена для изучения, кроме того, она будет отличаться для разных реализаций стандартной библиотеки. Это также будет очень сложным и не предназначенным для использования в качестве справочного материала (используйте соответствующую ссылку ). - person Some programmer dude; 16.03.2015

sizeof не дает вам количество элементов в контейнере; скорее, время компиляции оценивает размер структуры.

Таким образом, реальная ценность зависит от реализации стандартной библиотеки и, как таковая, может варьироваться от платформы к платформе.

person Bathsheba    schedule 16.03.2015