Est-ce que cette classe C ++ contenant un tableau de taille variable utilisent l'allocation dynamique de la mémoire?

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

Question

Ne faire quelque chose comme cette utilisation allocation dynamique de mémoire?

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

Quelqu'un peut-il me expliquer ce qui se passe dans les coulisses quand je crée l'objet?

CArray<SomeObject, 32> myStupidArray;
Était-ce utile?

La solution

Comme mentionné dans les autres réponses, les modèles sont évalués au moment de la compilation. Si vous êtes intéressés, vous pouvez avoir g ++ recracher la hiérarchie des classes où vous pouvez vérifier sa taille:

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;
}

Compiler avec -fdump-class-hierarchy:

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

Il devrait y avoir un fichier nommé blah.cc.t01.class dans le répertoire courant:

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

Autres conseils

n, il est attribué en place (par exemple, soit sur la pile, ou en tant que partie d'un objet contenant).

Avec des modèles les paramètres sont évalués à la compilation si votre code devient effectivement;

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

Modèles sont évaluées au moment de la compilation, de sorte m_data [_size] est compilé comme m_data [32].

Non, il n'utilise pas l'allocation de mémoire dynamique. Le compilateur sait combien de mémoire doit être alloué, il est décidé à la compilation, pas d'exécution.

Il ne fait aucun sens pour expliquer les modèles de C ici, ils sont très bien expliquées dans d'autres pages, comme dans le C ++ Faq lite .

La taille du tableau est connu au moment de la compilation, donc non, il ne sera pas en utilisant l'allocation de mémoire dynamique ici. Si vous déclarez le tableau dans un champ de fonction alors il sera mis sur la pile comme tout autre type d'objet.

Lorsque vous définissez des objets de taille variable comme celui-ci, ce qui se passe réellement est que le compilateur construit une définition de classe « à l'ordre ». Vous aurez juste utiliser une définition de classe qui contient T m_data [32] 'en elle.

1- Les modèles sont évalués uniquement au moment de la compilation. Donc, ce tableau sera de la taille 32

2- Vous ne pouvez pas créer un tableau sur la pile en utilisant une variable, il doit être une constante qui peut être évaluée au moment de la compilation, sinon vous pouvez utiliser le nouveau (ou malloc)

allocation dynamique de la mémoire se produit généralement lorsque vous appelez l'opérateur new (ou l'un de ses amis). Cela alloue une partie de la mémoire d'une réserve de mémoire communément appelée un tas. Rappelez-vous que, contrairement à l'allocation statique, le compilateur ne prend en charge sans pas la mémoire ing et donc vous devez le faire manuellement à l'aide de l'opérateur de delete (ou une version adaptée de celle-ci).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top