Скажем, у меня есть объект, который содержит три вектора 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 уже do используют указателив непрерывную память, где хранятся фактические элементы value_type
.
Тот же вопрос будет и для списков и т. д. *
ДА, list
s хранят ихvalue_type
элементов в куче тоже, и размер объекта, встраиваемого или полученного из list
, не зависит от операций с list
.
Существуют ли какие-либо практические правила относительностоимость перенаправления против стоимости копирования небольших объектов?Может быть, вдоль строк перенаправления 5 указателей = 1 целочисленная копия? enter code here
C ++ работает на слишком многих платформах, чтобы для этого существовали хорошие практические правила.Даже на процессорах, скажем, x86, различия в наборе команд, # ядрах, размерах кэша, поставщике / модели / генерации процессора и т. Д. Могут быть огромными.Косвенное обращение является наиболее дорогостоящим, если оно приводит к сбоям страницы памяти, и это очень зависит от общей картины выполнения программы на машине.Если вам интересно, тестируйте реальные компьютеры, на которых запущена программа, пока не найдете статистически значимых и стабильных результатов.