Если у меня есть массив этих объектов, и я делаю тег как строку, что произойдет, если пользователь введет EventItem в этот буфер, который имеет длинный тег? Приведет ли это к тому, что буфер или его части будут скопированы в другое место в памяти для хранения этого большего EventItem (большего из-за этой длинной строки)?
Если вы используете std :: string, то сам EventItem не будет увеличиваться (или уменьшаться) в размере независимо от того, что вы делаете с элементом строки. std :: string управляет своим фактическим содержимым, сохраняя его в другом месте. Внутри он, вероятно, содержит указатель на память, выделенную в другом месте (вероятно, с использованием new
). Если ему когда-либо понадобится расширение для хранения большего количества контента, он просто выделяет новую память, копирует данные и освобождает старое. Сам объект std :: string всегда имеет одинаковый размер.
Это относится практически ко всему в C ++. std :: vector, std :: list и т. д. По сути, любой объект, который каким-то образом динамически расширяется для хранения все большего и большего количества контента, фактически использует указатели и new
для хранения контента в другом месте.
С другой стороны, вам нужно быть осторожным, если вы когда-либо сохраняете свои собственные указатели на некоторые фрагменты контента, управляемые внутри объекта, такого как std :: string или std :: vector или тому подобное. При добавлении дополнительных элементов в такой контейнер весь набор может быть скопирован в другое место и, таким образом, лишает законной силы ваши указатели.
Так что, если у вас, возможно, есть std :: vector, то каждый раз, когда вы добавляете другой EventItem к этому вектору, он может перемещать всю группу в другое место в памяти. Но, конечно, если вы когда-нибудь получите доступ к этим элементам только через методы вектора (например, at () или operator []), вы даже не заметите разницу.