2010-08-31 5 views
1

En ce qui concerne la discussion hereEffet secondaire/Volatile/Copie Constructeur/Destructeur

$ 3.7.1/2 - « Si un objet de la durée de stockage statique a l'initialisation ou un destructor avec des effets secondaires, il ne doit pas être éliminé même s'il semble être inutilisé, sauf qu'un objet de classe ou sa copie peut être éliminé comme spécifié au 12.8. "

12,8/15- "Lorsque certains critères sont remplis, une implémentation est autorisée à omettre la construction de copie d'un objet de classe, même si le constructeur de copie et/ou le destructeur de l'objet ont des effets secondaires. Est-ce le cas ci-dessus, des exemples spécifiques d'un cas, où même une lecture/écriture volatile peut également être optimisée (par exemple si un constructeur de copie a une lecture/écriture sur une variable volatile). Donc, la question est "est-ce qu'un constructeur de copie peut être élidé même si le constructeur de copie a une lecture/écriture d'une variable volatile?"

+0

Quelle est la question ici? –

+0

@Billy ONeal: un constructeur de copie peut-il être élidé même si le constructeur de copie a une lecture/écriture d'une variable volatile? – Chubsdad

+0

@chubsdad: Oui, c'est possible. Les membres volatils d'une classe n'ont aucun sens de toute façon. 'volatile 'concerne l'accès à la mémoire matérielle. Il ne devrait jamais être utilisé pour autre chose. Déjà. Période. Ce n'est pas un outil multi-threading comme c'est en Java et C#. –

Répondre

0

NRVO n'est autorisé que si l'objet nommé est non volatile [son droit dans la même section que vous avez cité, la première puce], mais sinon, je ne vois pas pourquoi. Après tout, si l'objet que vous créez est volatile, vous écrivez toujours dessus, vous ne le faites pas via le constructeur de la copie. Et il ne qualifie pas quels effets secondaires il est autorisé à ignorer, si clairement si la lecture/écriture volatile est dans le constructeur de copie lui-même le compilateur n'a pas à se soucier.

+0

Je voulais dire un cas où l'objet de classe est non-qualifié cv, mais le constructeur de copie fait une lecture/écriture dans la variable volatile globale/namespace scope. Dans ce cas, le compilateur est autorisé à élider le constructeur de copie comme le dit la norme. Mais pourquoi? Pourquoi l'effet secondaire du constructeur de copie (mise à jour de la variable volatile, par exemple) n'est-il pas un élément dissuasif pour éliminer le constructeur de copie? – Chubsdad

+0

@chubs: Parce que les effets secondaires ne sont jamais dissuasifs pour élider les constructeurs de copie. Le compilateur ne sait même pas quels effets secondaires il pourrait avoir lorsqu'il décide d'élider la copie, donc en général il ne peut pas prendre en compte cette information. –

0

Parfois. C'est drôle, vous devriez demander, puisque quelque chose dont je me suis mal souvenu au sujet de volatile (que Johannes a appelé) m'a conduit à rechercher exactement de telles anecdotes.

§12.8/15:

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

Donc, il est correct d'éliminer un accès volatile en sélectionnant le constructeur, mais pas si l'objet entier est volatile.

En outre, il peut faire une différence si une fonction retourne volatile fooen valeur par opposition à foo ordinaire, parce que la construction du ne peut pas être éludée temporaire volatile!

foo factory_a(); // return class by value 
const foo factory_b(); // also return by value: rather pointless 
volatile foo factory_c(); // implies no elision 

Notez que le cv-qualification de la sémantique d'accès temporaire affecte également du retour temporaire, par exemple factory_b().non_const_method() est illégal. Donc, tout cela est plus mystérieux que boneheaded.