2016-12-28 3 views
3

Ce serait bien de pouvoir facilement rechercher du texte dans mon code pour les endroits où le constructeur de certains objets est appelé. Voici le motif ci-dessous. Au lieu de classique:Est-ce que déclarer la variable avec l'inférence de type est aussi efficace que la "méthode classique" d'initialisation de la variable avec des parenthèses après le nom de la variable?

  1. Object val(a, b);

Ce serait bien d'utiliser partout:

  1. auto val = Object(a, b);

De cette façon, je peux utiliser recherche de texte simple pour "Object(" et obtenir la liste des endroits où j'appelle le constructeur de Object. C'est aussi moins ambigu sur le plan syntaxique et donc plus facile de faire des outils simples pour automatiser certaines transformations de code. Il évite élégamment les problèmes de "l'analyse la plus vexante".

Ma seule préoccupation concerne l'impact possible sur les performances. Est-ce que le cas 2) est aussi rapide que le cas 1)? (Si l'on peut supposer que Object a correctement défini constructeur de déplacement et l'opérateur d'affectation de mouvement et optimisations de compilateur de base sont activés.)

+2

Plutôt que d'optimiser votre code pour les outils, vous pouvez essayer d'utiliser des outils qui fonctionnent avec votre code, tels que clang-query. –

+0

Notez que vous pouvez utiliser une initialisation uniforme depuis C++ 11 pour éviter le problème d'analyse le plus vexant. – skypjack

+0

Vous pouvez rechercher 'Object' et' ('avec un seul jeton entre –

Répondre

5

Pré C++ 17, il est possible, bien que peu probable, que vous obtiendrez une pénalité de performance en raison de une copie supplémentaire ou déplacer. Même C++ 98 permettait aux implémentations de supprimer de telles copies même si elles produisaient des effets secondaires, et presque tous les compilateurs ont mis en œuvre cette optimisation depuis longtemps - en particulier dans les versions optimisées.

Post C++ - 17, l'élision de la copie est garantie. Vous n'êtes même pas obligé d'avoir une copie ou déplacer le constructeur pour que cela fonctionne, donc vous ne devriez pas voir de différence.

+0

L'opérateur d'affectation n'est pas nécessaire cependant. –

+0

@CaptainGiraffe: D'accord. La question implique une initialisation et non une cession. –

+0

* "supprimer de telles copies même si elles produiraient des effets secondaires" *, cela ne brise-t-il pas la sémantique, dans le cas d'effets secondaires? –