Я пытаюсь создать в C ++ вектор, не зависящий от типа, который отличается двумя вещами. Во-первых, он выделяет память в самом объекте, по крайней мере, до определенного момента, а не поддерживает фактический массив объектов в куче. Во-вторых, он не может использовать конструкторы копирования / назначения C ++, которые, похоже, замедляют код и в этом нет необходимости.
Просматривая кодовую базу, которую я поддерживаю на своем компьютере, я обнаружил в кодовой базе LLVM класс, который почти полностью описывает то, что я ищу: SmallVector.h . Поскольку я относительно новичок в C ++, я не совсем уверен, почему были приняты некоторые дизайнерские решения.Например, почему массив распределен в терминах U
, а не T
? Комментарий дает подсказку:
Если у T есть ctor или dtor, мы не хотим, чтобы он запускался автоматически, поэтому нам нужно представить пространство как что-то еще. Массив char будет отлично работать, но может быть недостаточно выровнен. Вместо этого мы используем некоторое количество экземпляров объединения для пространства, что гарантирует максимальное выравнивание.
U
, конечно, относится к следующему объединению:
union U {
double D;
long double LD;
long long L;
void *P;
} FirstEl;
Итак, я думаю, вот мои истинные вопросы: Почему выделение массива T
подразумевает, что конструкторы / деструкторы называется? Есть ли способ перемещать экземпляры объектов С ++, то есть в вектор и из него, без вызова этих конструкторов / деструкторов? Думаю, я могу просто использовать реализацию LLVM SmallVector
, но я ненавижу использовать код, не понимая его.
С уважением, Дуэйн