Estoy intentando crear un vector agnóstico en C++ que se distingue por dos cosas. Primero, asigna la memoria en el objeto mismo, al menos hasta cierto punto, en lugar de mantener la matriz real de objetos en el montón. En segundo lugar, no puede usar los constructores de copia/asignación de C++, lo que parece ralentizar el código y no es necesario.Al mover/copiar instancias de objetos C++
Al mirar a través de la base de código que mantengo en mi computadora, encontré una clase en el código base de LLVM que describe perfectamente lo que estoy buscando: SmallVector.h. Siendo relativamente nuevo en C++, no estoy del todo seguro de por qué se tomaron algunas de las decisiones de diseño. Por ejemplo, ¿por qué la matriz se asigna en términos de U
en lugar de T
? El comentario da una pista:
Si T tiene un ctor o dtor, no queremos que se ejecute automáticamente, por lo que tenemos que representar el espacio como algo más. Una matriz de caracteres funcionaría muy bien, pero podría no estar lo suficientemente alineada. En su lugar, utilizamos algunas instancias de unión para el espacio, lo que garantiza la alineación máxima.
U
, por supuesto, se refiere a la siguiente unión:
union U {
double D;
long double LD;
long long L;
void *P;
} FirstEl;
lo tanto, supongo, que aquí son mis verdaderas preguntas: ¿Por qué la asignación de una serie de T
implica que los constructores/destructores se llaman? ¿Hay alguna forma de mover las instancias de objeto C++, es decir, dentro y fuera del vector, sin llamar a estos constructores/destructores? Creo que puedo usar la implementación de LLVM SmallVector
, pero odio usar código sin entenderlo.
Mejor, Duane
'C++ copia/asigna constructores, lo que parece ralentizar el código ...' Hace _corregir_ código, porque _son_necesarios. Hay varias clases que se bloquearán si alguna vez se vuelven a copiar, y no tienen un constructor predeterminado. –