#c #pointers #vector #reference
#c #указатели #вектор #ссылка
Вопрос:
При передаче вектора в функцию по ссылке гарантируется ли, что вызов функции сохранит действительность указателей на элементы вектора?
Предполагается, что внутри функции не выполняется никаких действий, которые могли бы вызвать перемещение вектора, например push_back()
.
пример:
int* fun(vector<int> amp;w) {
return amp;w[10];
}
vector<int> v( /* filled with 100 random elements */ )
int *p = amp;v[10];
int *q = fun(v); // return pointer to v[10] element via fun()
int *r = amp;v[10];
bool t1 = (p == q) amp;amp; (*p == *q); // always guaranteed to be true??
bool t2 = (p == r) amp;amp; (*p == *r); // always guaranteed to be true??
хотя, казалось бы, нетрудно утверждать, что да, конечно, сам вызов функции не приведет к аннулированию указателей на элементы вектора (ни внутри, ни вне функции), я исследовал этот вопрос, не будучи в состоянии найти окончательный ответ.
вопрос также можно сформулировать следующим образом: гарантированно ли вызов функции с использованием «вектора по ссылке» (как в примере) не приведет к перемещению вектора и его элементов?
более обобщенный вопрос: для любого объекта или контейнера X
: X
гарантированно ли вызов функции с использованием ссылки на не приведет к перемещению X
или любому из его компонентов?
Комментарии:
1. Со ссылкой не может произойти ничего волшебного, если для нее не была вызвана операция изменения. Векторы перемещают данные только при явных обстоятельствах, таких как увеличение размера или удаление элементов, которые не находятся в конце.
2. Если вы не добавляете или не удаляете из вектора, его хранилище не будет перераспределено. Обратите внимание, что сам объект никогда не может перемещаться. В вашем примере
int *q = fun(v);
это точно так же, какint *q = amp;v[10];
.3. все зависит от того, что функция делает со ссылкой. Другая альтернатива для той же «проблемы» — встроить всю функцию. Вы бы все равно спросили то же самое, когда в вашем коде я заменяю
int *q = fun(v);
наint *q = amp;w[10];
?4. перераспределение вектора, когда в этом нет необходимости, не является оптимизацией ;). Существуют правила недействительности итератора. Если что-то явно не указано, то итератор должен оставаться действительным
5. у вас есть реальная проблема или это просто академическое? Последнее само по себе не является проблемой, но неясно, на чем основаны ваши сомнения или что вы ищете в качестве ответа. Вы ищете цитаты из стандарта?