¿Esta clase de C ++ que contiene una matriz de tamaño variable de utilizar la asignación de memoria dinámica?

StackOverflow https://stackoverflow.com/questions/554476

Pregunta

¿El hacer algo como este uso asignación dinámica de memoria?

template <class T, int _size> 
class CArray 
{ 
public:
    ... 
private:
    T m_data[_size]; 
};

Puede alguien explicarme lo que está pasando detrás de las escenas cuando se crea el objeto?

CArray<SomeObject, 32> myStupidArray;
¿Fue útil?

Solución

Como se mencionó en las otras respuestas, las plantillas se evalúan en tiempo de compilación. Si está interesado puede tener g ++ escupir la jerarquía de clases donde se puede verificar su tamaño:

template <class T, int _size>
class CArray
{
public:
private:
  T m_data[_size];
};

int main(int argc, char **argv) {
  CArray<int, 32> myStupidArray1;
  CArray<int, 8> myStupidArray2;
  CArray<int, 64> myStupidArray3;
  CArray<int, 1000> myStupidArray4;
}

Compilar con -fdump-class-hierarchy:

g++ -fdump-class-hierarchy blah.cc

Debe haber un archivo llamado blah.cc.t01.class en el directorio actual:

Class CArray<int, 32>
   size=128 align=4
   base size=128 base align=4
CArray<int, 32> (0x40be0d80) 0

Class CArray<int, 8>
   size=32 align=4
   base size=32 base align=4
CArray<int, 8> (0x40be0e80) 0

Class CArray<int, 64>
   size=256 align=4
   base size=256 base align=4
CArray<int, 64> (0x40be0f80) 0

Class CArray<int, 1000>
   size=4000 align=4
   base size=4000 base align=4
CArray<int, 1000> (0x40be6000) 0

Otros consejos

No, que se asignará en el lugar (por ejemplo, ya sea en la pila, o como parte de un objeto que contiene).

Con las plantillas de los parámetros son evaluados en tiempo de compilación para que su código se convierte efectivamente;

class CArray 
{ 
public:
    ... 
private:
    SomeObject m_data[32]; 
};

plantillas son evaluados en tiempo de compilación, por lo M_DATA [_size] es compilado como M_DATA [32].

No, no utiliza la asignación de memoria dinámica. El compilador sabe cómo debe asignarse la cantidad de memoria, se decide en tiempo de compilación, no en tiempo de ejecución.

No tiene ningún sentido para explicar las plantillas de C ++ aquí, que se explican bastante bien en otras páginas, como en el C ++ FAQ Lite .

El tamaño de la matriz es conocido en tiempo de compilación, por lo que no, que no va a utilizar la asignación de memoria dinámica aquí. Si se declara la matriz en un ámbito de la función, entonces va a ser puesto en la pila al igual que cualquier otro tipo de objeto.

Al definir los objetos de tamaño variable de este tipo, lo que realmente sucede es que el compilador es la construcción de una definición de clase 'a fin'. Sólo te va a estar utilizando una definición de clase que contiene 'T M_DATA [32]' en el mismo.

1- plantillas sólo se evalúan en tiempo de compilación. Así que esta matriz será de tamaño 32

2- No se puede crear una matriz en la pila utilizando una variable, debe ser una constante que se puede evaluar en tiempo de compilación, cosa que se pueda utilizar la nueva (o malloc)

asignación de memoria dinámica se produce normalmente cuando se llama al operador new (o uno de sus amigos). Esto asigna un trozo de memoria de una reserva de memoria comúnmente se hace referencia como un montón. Recuerde que a diferencia de la asignación estática, el compilador no toma el cuidado de free-ing la memoria y lo que tiene que hacerlo de forma manual mediante el operador delete (o una versión adecuada de los mismos).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top