Является ли std :: vector тривиально копируемым и почему? - PullRequest
0 голосов
/ 18 января 2019

Я столкнулся с проблемой с std::vector<T>, где T - это встроенный тип, говорящий о том, что вектор не может быть просто скопирован.

Мне было интересно, правильно ли это, и я ищу причину.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

A vector растет по мере добавления к нему данных.Это означает, что не нужно заранее знать, сколько места необходимо для хранения всех его данных.vector решает эту проблему, выделяя (и перераспределяя) отдельный буфер хранения в куче.Этот буфер управляется изнутри, предоставляя интерфейс, который может быть массивом переменного размера.

Теперь, если объект может быть сконструирован тривиально, можно копировать / клонировать объект, просто используя memcpy(dest, &a, sizeof(a)),Если бы сделать это для vector, у него было бы 2 векторных объекта, указывающих на один и тот же буфер хранения.Это приведет к ужасному неопределенному поведению.Поэтому для копирования вектора необходимо продублировать внутреннее хранилище, продублировать его параметры, а затем установить внутренний указатель, указывающий на правильный буфер хранилища.Это требует внутренних знаний об объекте.

std::array однако, статический размер установлен во время компиляции.Он не имеет внутренних указателей и поэтому может быть скопирован просто с помощью memcpy.Поэтому копировать тривиально.

0 голосов
/ 18 января 2019

Формально std::vector<T> (для любого T) не является тривиально копируемым , потому что его конструктор копирования не тривиален , хотя бы потому, что он предоставлен пользователем (в отличие от к неявно определенным).

Практически говоря, копирование вектора включает в себя нечто большее, чем просто копирование его элементов данных - для этого требуется выделение буфера памяти в куче и копирование его содержимого из буфера, выделенного в куче другого вектора.

...