Récemment, j'ai examiné certains Code C et j'ai trouvé quelque chose d'équivalent à ce qui suit:
struct foo { int some_innocent_variables; double some_big_array[VERY_LARGE_NUMBER]; }
6 Réponses :
Oui, en C, vous passeriez généralement un pointeur à la structure en raison de raisons d'efficacité. P>
Si vous passez par la valeur Oui, cela fera une copie de tout. Mais c'est pourquoi les pointeurs existent.
//Just the address is passed void doSomething(struct foo *myFoo) { }
Pour rester aussi proche de la valeur de passage que possible tout en gagnant l'efficacité de la transmission par référence, vous pouvez utiliser struct FOO CONSTO * CONSTOY MYFOO code>. Cela indiquera au compilateur de vous avertir lorsque vous essayez accidentellement de modifier le pointeur ou le pointeur à la valeur.
Etre transmis comme un argument, il sera copié, ce qui est un moyen très inefficace de passer des structures, en particulier les plus gros. Cependant, fondamentalement, les structures sont transmises à des fonctions par le pointeur.
Choix entre p>
double *some_pointer
Il y a beaucoup de raisons d'utiliser des tableaux dans les structures. Parmi eux, c'est que les structures sont transmises à des fonctions par la valeur, tandis que les tableaux sont transmis par référence. Cela dit, cette structure est probablement transmise à des fonctions avec des pointeurs. P>
Comme d'autres l'ont dit, les objets de ce type sont généralement passés avec des pointeurs (toujours Vous pouvez également voir le "STRIT HACK "(Aussi transmis avec des pointeurs): p> Ce" structure hack "obtient une matrice dimensionné par le Tailleof (struct FOO) code> octets, souvent 4 octets).
malloc code> appel. p> < Pré> xxx pré> p>
Edit: Cette structure va bien tant que vous le transmettez par référence (à l'aide d'un pointeur). P>
Offtopic:
Méfiez-vous du piratage de la structure, comme il est non strictement conformiste standard ; Il ignore le rembourrage automatique. Les files d'attente de messagerie IPC UNIX l'utilisent (voir Cela dit, les fonctions qui utilisent cette structure peuvent utiliser des pointeurs vers elle au lieu d'utiliser une copie. P> struct msgbuf code>), cependant, et il est presque certainement de travailler avec n'importe quel compilateur. P>
L'inefficacité dans l'utilisation de l'espace dépend de la question de savoir si vous utilisez ou non l'espace alloué. Si l'ensemble de la matrice est toujours utilisé, un pointeur ajoutera quelques octets d'espace gaspillé pour stocker le pointeur lui-même (même si négligeable pour les grands tableaux).