Struct avec les membres de la pile en C
Récemment, j'ai revu certains de code C et de trouver quelque chose d'équivalent à celui-ci:
struct foo {
int some_innocent_variables;
double some_big_array[VERY_LARGE_NUMBER];
}
Presque, mais pas tout à fait, presque entièrement un débutant en C, je suis en droit de penser que cette structure est terriblement inefficace dans son utilisation de l'espace en raison du membre du groupe? Ce qui se passe lorsque cette structure est passée comme argument à une fonction? Est-il copié dans son intégralité sur la pile, y compris la gamme complète?
Serait-il préférable dans la plupart des cas d'avoir un double *some_pointer
à la place?
L'inefficacité dans l'utilisation de l'espace dépend de si oui ou non vous utilisez l'espace alloué. Si l'ensemble du tableau est toujours utilisée alors un pointeur ajoutera quelques octets d'espace perdu pour stocker le pointeur lui-même (même si négligeable pour les grands réseaux).
OriginalL'auteur lindelof | 2010-09-13
Vous devez vous connecter pour publier un commentaire.
Si vous passez par la valeur oui, il va faire une copie de tout.
Mais c'est pourquoi les pointeurs existent.
struct foo const * const myFoo
. Ce sera de dire au compilateur pour vous avertir accidentellement lorsque vous essayez de modifier le pointeur ou pointu de valeur.OriginalL'auteur Brian R. Bondy
Être passé comme argument, il sera copié ce qui est très moyen inefficace de passage de structures, en particulier de gros. Cependant, fondamentalement, les structures sont passés aux fonctions par pointeur.
Le choix entre
et
ne dépend que de la conception du programme et la façon dont ce champ/structure sera utilisé. Ce dernier permet à l'aide de la variable de taille de stockage, cependant, peuvent avoir besoin d'allocation dynamique.
OriginalL'auteur pmod
Comme d'autres l'ont dit, les objets de ce type sont généralement passés avec des pointeurs (toujours
sizeof (struct foo)
octets, souvent de 4 octets).Vous pouvez également voir les "struct hack" (également passés avec les pointeurs):
Cette "struct hack" obtient un tableau de taille par le
malloc
appel.OriginalL'auteur pmg
Oui, en C, vous aurait généralement de passer un pointeur vers la structure due à des raisons d'efficacité.
OriginalL'auteur Jim Brissom
Il ya beaucoup de raisons pour utiliser des tableaux dans des structures. Parmi eux est le fait que les structures sont passés aux fonctions par valeur, tandis que les tableaux sont passés par référence. Cela dit, cette structure est probablement transmise à des fonctions avec des pointeurs.
OriginalL'auteur nmichaels
EDIT: Cette structure est très bien aussi longtemps que vous le passer par référence (à l'aide d'un pointeur).
Offtopic:
Méfiez-vous de la structure hack, c'est pas strictement conforme à la norme; il ignore le remplissage automatique. Les IPC Unix files d'attente de messages de l'utiliser (voir
struct msgbuf
), même si, et il est presque certainement de travailler avec n'importe quel compilateur.Cela dit, les fonctions qui utilisent cette structure peut utiliser des pointeurs au lieu d'utiliser une copie.
OriginalL'auteur Pablo Alejandro Costesich