У меня есть два вопроса для следующего кода: 1) Будут ли элементы faces
быть смежным?
2) Есть ли std::vector
скопировать или переместить Face f
при вставке?
#include <vector>
int main()
{
struct Face {};
std::vector<Face> faces;
for (int i=0; i<10; ++i)
{
Face f;
faces.push_back (f);
}
return 0;
}
Согласно стандарту § 23.3.6.1 Обзор вектора шаблона класса [vector.overview]:
Элементы
vector
хранятся смежно, это означает, что еслиv
этоvector<T, Allocator>
гдеT
это какой-то тип, кромеbool
тогда он подчиняется личности&v[n] == &v[0] + n for all 0 <= n < v.size()
,
Что касается вашего второго вопроса в предыдущих компиляторах C ++ 11 push_back
скопировал бы объект, который вы нажимаете.
После C ++ 11 это зависит от того, push_back
имеет две перегрузки, одна из которых принимает lvalue
ссылка и еще один, который занимает rvalue
ссылка.
В вашем случае он будет скопирован, потому что вы передаете объект как lvalue
, Для обеспечения движения объекта вы можете использовать std::move()
,
faces.push_back(std::move(f));