Dans le code Code ci-dessous:
C c = fxn3(fxn1(x1, x2, ...), fxn2(y1, y2, ...));
3 Réponses :
Pourquoi ne pas le faire simplement?
Le code suivant: résultats à: p> Ce que vous voyez est: p> Toutes vos fonctions sont réduites à une seule charge constante: p> qui est simplement "-3". p> Le reste de la principale est uniquement destiné à utiliser Donc donc votre question: p> peut la création des variables factices 'A' et 'B' avec les résultats de FXN1 et FXN2 être optimisées par le compilateur afin que les résultats de FXN1 et FXN2 soient passés directement sous forme d'arguments sur FXN3? P>
BlockQuote> est simplement "Oui" :-) Il "peut" être mais ce n'est pas un must. Surtout si votre code dépend de plus de variables et produit des effets secondaires, il ne sera peut-être pas évalué à un Cons Var. Vous devez donc toujours mesurer et vérifier votre propre code réel! P> p> std :: Cout code>. P>
" Pourquoi ne pas le faire simplement? I>" Parce que cela ne prouve rien. Donnez à ces types des destructeurs et je soupçonne que vous trouverez quelque chose de très différent.
Exactement! Donc, vous devez simplement vérifier!
La question n'était pas sur ce que font les compilateurs. C'était sur quels compilateurs peuvent faire i>.
Exactement! Et comme vous le voyez: ils peuvent optimiser toutes les choses, mais ce n'est jamais une garantie!
Oui. Je vois la différence maintenant avec le compilateur Explorer. Merci
Fait :). Bien que je voudrais aussi ajouter que les réponses de Bruno et de Jvapen aident également à mieux comprendre ce qui se passe derrière le code.
@Neophyte: Merci! Oui, c'est ce que nous avons les upvotes pour :) Happy Coding!
En théorie, oui, c'est possible. Si vous écrivez les doublures, vous obtenez également des temporels modélisés par le compilateur. La différence d'intention se trouve dans la vie et le destructeur. Lorsque votre compilateur peut prouver la durée de vie n'a pas d'importance, cela peut le faire. P>
En pratique, vous devez vous assurer que le compilateur peut voir ce qui se passe, soit permettre une optimisation du temps de liaison (LTO) ou d'avoir le code inlincé. Avoir des destructeurs personnalisés dans les classes A et B ou un de ses membres n'aident pas, surtout lorsque dans un autre fichier de RPC (si vous n'avez pas LTO) P>
On peut se demander s'il a même logique de s'inquiéter de ces éléments. Souvent, il est plus logique de profiler votre code et de regarder où vous vous perdez le plus de temps. P>
Quand cela semble faire partie du chemin à chaud, vérifiez l'ensemble généré. Compiler Explorer est un très bon outil en ligne pour vous aider avec cela. P>
Cette réponse me fait me demander pourquoi ma question a été bullevée. C ++ est un sujet aussi large et profond que je ne pense pas que beaucoup de ces nouvelles pour C ++ sauraient cette réponse.
Cependant, ce n'était pas moi, cependant, en regardant la question, ma première réaction était: pourquoi vous souciez-vous même? Voyez-vous un problème de performance à cet endroit? Et la réorganisation des DTOR améliore-t-elle l'utilisation de la mémoire / de la CPU?
Cela peut être ou ne pas être utile, mais savoir ce qui se passe sous la hotte permet d'accroître la compréhension. Voir l'assemblage généré aidé à le refuser.
Je me rends compte que le code pourrait facilement être écrit comme p>
Avertissement, avec P>
A a = fxn1(x1, x2, ...); B b = fxn2(y1, y2, ...); C c = fxn3(a, b);
Peut-être. Cela dépend en quelque sorte des fonctions et sur ce que
A code> et
b code> sont et quelles optimisations vous avez activées lors de la construction. Vérifiez le code de la machine généré si vous êtes curieux de voir ce que le compilateur fait.
Soyez conscient du AS-Si la règle
Comment diriez-vous, en consultant le code de montage ou par tout autre moyen, si une variable a été optimisée?
Voici une petite démonstration courte: goodbolt.org/z/nstqw7 sauf si vous faites quelque chose de compliqué avec
c C code>, même cela est optimisé.
@Flamber. Thx pour l'exemple. Voir l'assembly indique clairement