Est-il plus rapide de passer un struct ou ses membres individuellement?

Si j’ai un

struct Foo { int A; int B; }; 

Quelle méthode est la plus rapide?

 void Bar(Foo MyFoo) 

ou

 void Bar(int A, int B) 

?

Ou sont-ils les mêmes?

Cela peut dépendre de la plate-forme et du compilateur. Surtout quand le sizeof (Foo) est petit.

Si les entrées sont de 16 bits, une seule poussée de stack de 32 bits est nécessaire, ce qui est inférieur à un pointeur sur des architectures à 64 bits, mais ces entrées ont souvent plus de 16 bits.

En tant qu’arguments séparés, chacun constituera un push séparé dans la stack, sauf si le compilateur fait quelque chose d’intelligent, … ce qu’il fait fréquemment. Cette structure pourrait probablement être traitée comme un simple envoi vers la stack sur la plupart des plates-formes modernes.

Lorsque vous entrez dans des structures plus intéressantes qui sont encore petites, telles que contenir des caractères uniques ou des champs de bits, la transmission de la structure peut être plus rapide, même lorsqu’elle est passée par valeur.

Mais ce ne sont que des différences insignifiantes, sauf si vous travaillez sur une plate-forme plus proche d’une vieille calculasortingce qu’un téléphone moderne pas cher.

Se mêler aux autres; passer par référence est généralement le plus rapide, mais la mesure ou l’inspection de l’assemblage généré est le seul moyen de s’assurer de la qualité de la plate-forme.

Note latérale: Si vous passez au C ++, les choses peuvent devenir un peu plus compliquées, mais vous devriez plutôt passer la structure en tant que référence const, ce qui est fondamentalement un pointeur, mais donne encore plus de chances à l’ordinateur d’être intelligent.

Dans ce cas, ils sont les mêmes.

Plus vous transmettez de parameters dans une fonction, plus l’appel sera coûteux. Cela est dû à plusieurs pressions sur la stack à chaque appel. Passer des structures complètes sera identique à passer chaque partie d’une structure. Vous devez utiliser des pointeurs et des références dans de tels cas.

Comme paul l’a dit, utilisez void Bar(Foo* MyFoo)

Dépenser une adresse mémoire (par référence) est préférable à dépenser les valeurs (par valeurs).