2011-07-20 2 views
1

Par exemple, j'ai cette structure et le code:Quelle est la meilleure façon d'allouer de la mémoire aux variables dans une structure?

typedef struct 
{ 
long long *number; 
} test; 

test * test_structure; 
test_structure = malloc(sizeof(test)); 
test_structure->number = malloc(sizeof(long long) * 100); 
free(test_structure->number); 
free(test_structure); 

par rapport à cette structure et le code:

typedef struct 
{ 
long long number[100]; 
} test; 

test * test_structure; 
test_structure = malloc(sizeof(test)); 
free(test_structure); 

Depuis que je sais que le tableau de nombre sera toujours de 100, sont l'une de ces méthodes parfaitement acceptable, ou est-ce un moyen mieux que l'autre, et pourquoi?

Répondre

6

La deuxième façon est préférable pour plusieurs raisons:

  1. Il vous suffit de libérer une allocation, pas deux (réduite risque de fuite de mémoire).
  2. Vous avez encodé la taille de la matrice dans la structure de données, ce qui pourrait faciliter l'analyse de code. La première version pourrait avoir n'importe quelle taille, et personne ne peut dire que n'importe quel indice est faux. Si vous avez ajouté un membre 'size' qui a été correctement initialisé à la première structure, il y aurait moins de force à cet argument, mais pas beaucoup moins de force.
  3. Vous pouvez copier l'intégralité de la seconde structure avec une affectation de structure; vous ne pouvez pas copier la première structure de la même manière.
  4. L'assembleur généré est légèrement différent (plus long) pour le premier (il doit extraire l'adresse du membre, puis la déréférencer, au lieu de simplement déréférencer avec le second).

Avec tout cela, les deux méthodes sont sensiblement les mêmes. Vous utilisez (j'ai été tenté de dire 'gaspiller' mais ce n'est pas tout à fait juste) plus d'espace avec le premier, mais il est peu probable que ce soit un problème majeur (et si c'était le cas, vous voudriez 100, car cela vous permettra d'économiser plus d'espace que de bricoler avec un pointeur ou un tableau).

3

J'y retournerais sans hésiter. Le profil de la mémoire sera presque identique. Avec juste une allocation de mémoire, et donc moins de pièces mobiles à suivre, il n'y a pratiquement aucune raison d'envisager la première alternative.

En fait, même pour un tableau de longueur inconnue, j'irais probablement pour un long long * nu plutôt qu'un wrapper struct qui semble n'ajoute aucune valeur.

0

Je vais avec ce dernier SEULEMENT parce que vous dites que vous connaissez la taille de la matrice. Si non, alors le premier.

Questions connexes