Question

Comment allez-vous en utilisant le l'optimisation de la valeur de retour ?
Y at-il des cas où je peux faire confiance à un compilateur moderne d'utiliser l'optimisation, ou devrais-je aller toujours le moyen sûr et retourner un pointeur d'un certain type / utiliser une référence comme paramètre?

Y at-il des cas connus où l'optimisation de la valeur de retour ne peut pas être fait ?, me semble que l'optimisation de la valeur de retour serait assez facile pour un compilateur à effectuer.

Était-ce utile?

La solution

Chaque fois que les optimisations du compilateur sont activées (et dans la plupart des compilateurs, même lorsque les optimisations sont désactivé ), RVO aura lieu. NRVO est légèrement moins fréquent, mais la plupart des compilateurs effectuera cette optimisation et, au moins lorsque les optimisations sont activées.

Vous avez raison, l'optimisation est assez facile pour un compilateur pour effectuer, ce qui explique pourquoi les compilateurs faire presque toujours. Les seuls cas où il « ne peut pas être fait » sont ceux où l'optimisation ne s'applique pas: RVO applique uniquement lorsque vous retournez un sans nom temporaire. Si vous voulez retourner une variable locale nommée, NRVO applique à la place, et alors qu'il est un peu plus complexe pour un compilateur pour mettre en œuvre, il est faisable, et les compilateurs modernes ont pas de problème avec elle.

Autres conseils

Pour avoir la meilleure chance qu'il se produit, vous pouvez renvoyer un objet construit directement dans la déclaration de retour [quelqu'un peut-il se rappeler le nom de cet idiome - je l'ai oublié]:

Foo f() {
    ....
    return Foo( ... );
}

Mais comme avec tous Optimisations, le compilateur peut toujours choisir de ne pas le faire. Et à la fin de la journée, si vous avez besoin de retourner une valeur de toi est pas d'alternative à faire confiance au compilateur -. Pointeurs et références ne sera pas coupé

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top