Скажем, у меня есть объект, содержащий три вектора stl. Правильно ли я думаю, что если они являются обычными членами класса, память о них будет «вместе» для всего объекта? например моя память будет выглядеть как 10 блоков вектора A, 5 блоков вектора B, а затем 15 блоков вектора C.
Каждый vector
занимает фиксированный размер в содержащем объекте, независимо от количества элементов, хранящихся в данный момент в vector
. Вполне вероятно, что value_type
из vector
(например, vector<int>
имеет value_type
int
) не повлияет на размер самого содержащегося объекта vector
: только объем выделенного в куче хранилища, необходимого vector
для поддержания емкости хранилища (поэтому они вроде бы будет 8 или 16 или 32 байта каждый, но все равно, но не 10 "блоков" (что бы это ни было), 5 блоков и 15).
Будет ли тогда, когда я вставлю больше объектов в вектор A, чтобы пространство закончилось, вся структура, включая вектор B и C, должна быть перемещена?
Вставка элементов в A
может привести только к перемещению существующих элементов в A
(при превышении емкости). B
и C
никогда не могут быть затронуты.
Это аргумент в пользу указателей? Или векторы внутри являются только указателем на выделенную память?
ДА, это аргумент... настолько хороший, что ДА, vector
s уже делают использование указателей на непрерывную память, где фактически хранятся value_type
элементов.
Тот же вопрос касается списков и т.д.
ДА, list
также хранят свои value_type
элементы в куче, а размер объекта, внедренного или полученного из list
, не зависит от операций над list
.
Существуют ли какие-либо эмпирические правила относительно стоимости перенаправления и стоимости копирования небольших объектов? Может быть, что-то вроде перенаправления 5 указателей = 1 целочисленная копия?enter code here
C++ работает на слишком многих платформах, чтобы для этого существовали хорошие эмпирические правила. Даже, скажем, на процессорах x86 различия в наборе инструкций, # ядрах, размерах кэша, поставщике/модели/поколении процессора и т. д. могут быть огромными. Косвенность обходится наиболее дорого, если приводит к ошибкам страниц памяти, а это очень зависит от общей картины выполнения программы на машине. Если вам небезразлично, протестируйте реальные компьютеры, на которых запущена программа, пока не получите статистически значимые и стабильные результаты.
09.05.2011