При перемещении / копировании экземпляров объектов C ++

Я пытаюсь создать в 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 , но я ненавижу использовать код, не понимая его.

С уважением, Дуэйн

5
задан duane 2 November 2011 в 23:45
поделиться