Я читаю книгу о С++, пытаясь выучить язык. есть один пример, где он создает векторный класс, который работает только со строками с именем stringV
. класс определяет функцию с именем reallocate
, которая должна выделять новую динамическую память и перемещать свои строки в новую память в случае, если старая память заполняется.
void stringV::reallocate(){
size_t newcap = size() ? size() * 2 : 1;
auto newalloc = alloc.allocate(newcap);
auto mem = newalloc;
auto elem = element; // element pointes to the first string object in the memory segment
for (size_t i = 0; i < size(); i++){
alloc.construct(newalloc, std::move(*elem));
newalloc++;
elem++;
}
free(); //destroys and deallocates the dynamic memory held by this object
element = mem;
first_free = newalloc; // one past the last element
cap = element + newcap; // last part of the possibly unconstructed memory
}
эта функция использует конструктор перемещения класса строки в соответствии с книгой, крадет состояние переданного ему объекта путем замены указателей между строковыми объектами (которые, как я предполагаю, являются указателем на первый элемент, похожий на встроенный массив) вместо того, чтобы копировать каждый символ отдельно. например, давайте предположим, что у нас есть объект stringV
с именем foo
, в котором выделена динамическая память, достаточная для 3 строк. и мы начинаем с присвоения строк "one"
, "two"
и "three"
. теперь, когда мы пытаемся поместить четвертую строку, "four"
, этому контейнеру придется перераспределить память, вызвав reallocate
Однако разве строковые объекты не строят свои символы в соседних местах один за другим (аналогично реализации встроенных массивов ). и когда мы используем конструктор перемещения, мы крадем только указатель на первый символ в строке. так что не будет ли это означать, что строковые элементы (символы) "one"
, "two"
и "three"
все еще находятся в том же старом, теперь заполненном сегменте памяти. и новая выделенная память должна будет содержать только указатели на эти элементы и любые новые последующие строки, "four"
... и т.д. которые помещаются в наш объект foo
? и не повлияет ли это на эффективность (по меньшей мере), учитывая, что наши строки (массивы символов) больше не находятся в соседних местах?