Question

Je demande peut-être une question stupide, mais je regardais la page wikipedia pour RVO et ne pouvait pas cesser de se demander si ce comportement est mauvais. Je l'ai essayé dans ma machine et RVO est entièrement en dépit de niveau botté d'optimisation. Et s'il y avait en fait quelque chose BIG happenning dans un constructeur? Je sais que ce ne devrait pas, mais si? Je ne comprends pas pourquoi RVO serait encore se produire quand il y a des effets secondaires dans le constructeur.

EDIT: -fno-elide-constructors semble arrêter RVO. Mais la question demeure.

EDIT2: Sur une note plus sérieuse, combien de personnes savent quelque chose comme ça? Il peut-être dans la norme, mais il est encore une caractéristique vraiment moche comme je le vois. Au moins compilateurs désactivent par défaut et fournir un commutateur pour les personnes qui connaissent ce sujet. :)

EDIT 3: J'insiste encore que c'est vraiment mauvais. :). Je ne pense pas que je ne connais aucune autre contrainte linguistique comme celui-ci qui va directement à l'encontre de la syntaxe du langage. Tout autre jette soit des erreurs du compilateur ou l'éditeur de liens à droite?

Était-ce utile?

La solution

Les mandats standard des opérations avec l'inquiétude d'un programme état observable ne doit pas être optimisé loin, sauf pour la construction de copie dans certaines circonstances. Vous ne devez pas compter sur les constructeurs de copie à exécuter, même si elles ont des effets secondaires que vous attendez à voir (par exemple, la sortie de la console).

Autres conseils

Comme l'a dit dans les autres réponses, le compilateur est autorisé optimize loin même non trivial des constructeurs de copie et les opérateurs d'affectation.

  

12.8.15

     

Lorsque certains critères sont respectés, une mise en œuvre est autorisé à omettre la construction de copie d'un objet de classe, même si   le constructeur de copie et / ou destructor pour l'objet ont des effets secondaires . Dans de tels cas, la mise en œuvre traite la   source et la cible de l'opération de copie omis comme simplement deux façons différentes de faire référence au même objet, et   la destruction de cet objet se produit au plus tard des moments où les deux objets auraient été détruits sans   optimisation. Cette élision des opérations de copie est autorisée dans les circonstances suivantes (qui peut être combiné   d'éliminer les copies multiples):

     

- dans une déclaration de retour en fonction d'un type de retour de classe, lorsque l'expression est le nom d'un non-volatile   objet automatique avec le même type de cv-non qualifié comme type de retour de la fonction, l'opération de copie peut être omise   en construisant l'objet automatique directement dans la valeur de retour de la fonction

     

- lorsqu'un objet de classe temporaire qui n'a pas été lié à une référence (12.2) serait copié sur un objet de classe   le même type de cv-non qualifié, l'opération de copie peut être omise en construisant l'objet temporaire directement   la cible de la copie omis

Définir "mauvaise". Le langage C permet de explicitement ce genre d'optimisation, même si elle est observable. Si le comportement de votre programme dépend d'une mise en œuvre spécifique, alors vous malheureusement pas utiliser ISO C ++, mais un dialecte.

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