112 votes

Quelle est exactement la règle "as-if"?

Comme le dit le titre,

Quel est exactement le "comme-si" la règle?

Une réponse typique on est:

La règle qui permet de tout et de tout le code des transformations qui ne changent pas les comportements observables du programme

De temps à autre, nous reçois des comportements de certaines implémentations qui sont attribués à cette règle. Beaucoup une fois à tort. Alors, Quelle est exactement cette règle. La norme n'est pas clairement mention de cette règle comme une section ou un paragraphe, qu'est-ce exactement tombe sous le coup de cette règle? Pour moi, il semble comme une zone grise, ce qui n'est pas définie en détail par la norme. Quelqu'un peut-il préciser tous les détails en citant les références de la norme.

Remarque: le Marquage ce comme le C et le C++ à la fois, car il est pertinent de les deux langues.

120voto

Andy Prowl Points 62121

Qu'est-ce que le "comme-si" la règle?

Le "comme-si" règle fondamentalement définit quelles transformations d'une œuvre est autorisée à effectuer sur un juridique un programme C++. En bref, toutes les transformations qui affectent pas un programme "et les comportements observables" (voir ci-dessous pour une définition précise) sont autorisés.

L'objectif est de donner les implémentations de la liberté de procéder à des optimisations tant que le comportement du programme demeure conforme à la sémantique spécifiée par la Norme C++ en termes d'une machine abstraite.


D'où vient le Standard introduire cette règle?

Le C++11 introduit le "comme-si" règle du Paragraphe 1.9/1:

La sémantique des descriptions dans la présente Norme Internationale définir un paramétrée de façon non déterministe abstrait de la machine. La présente Norme Internationale n'impose aucune exigence sur la structure de la conformité des mises en œuvre. En particulier, ils n'ont pas besoin de copier ou de reproduire la structure de la machine abstraite. Plutôt, conforme les implémentations sont nécessaires pour émuler (seulement) les comportements observables de la machine abstraite, comme expliqué ci-dessous.

Aussi, une note explicative ajoute:

Cette disposition est parfois appelé le "comme-si" la règle, parce que l'application est libre de faire abstraction de toute exigence de la présente La Norme internationale, tant que le résultat est comme si l'obligation avait été obéi, autant que cela peut être déterminée à partir de la les comportements observables du programme. Par exemple, une mise en œuvre effective n'a pas besoin d'évaluer une partie d'une expression si elle peut en déduire que sa valeur n'est pas utilisée et qu'aucun des effets secondaires affectant les comportements observables du programme sont produites.


Quelle est la règle de mandat exactement?

Le paragraphe 1.9/5 précise en outre:

Conforme de la mise en œuvre de l'exécution d'un bien formé programme doit produire les mêmes comportements observables comme l'un des exécutions de l'instance correspondante de la machine abstraite avec le même programme et de la même entrée. Cependant, si une telle exécution contient un indéfini, cet International La norme n'impose aucune exigence sur la mise en œuvre de l'exécution de ce programme avec celui d'entrée (même pas concernant les opérations précédant le premier pas défini de l'opération).

Il est important de souligner que cette contrainte s'applique lors de l' exécution d'un bien formé programme" , et que les résultats possibles de l'exécution d'un programme qui contient un comportement indéfini sont sans contrainte. Ceci est explicité dans le Paragraphe 1.9/4 ainsi:

Certaines autres opérations sont décrites dans la présente Norme Internationale comme non défini (par exemple, l'effet de la tentative de modifier une const objet). [ Note: la Présente Norme Internationale n'impose pas d'exigences sur le comportement des programmes qui contiennent un comportement indéfini. -la note de fin ]

Enfin, concernant la définition de "comportements observables", Paragraphe 1.9/8 va comme suit:

Au moins les exigences de la conformité de la mise en œuvre sont:

- L'accès à la volatilité des objets sont évalués strictement selon les règles de la machine abstraite.

- À la fin du programme, toutes les données écrites dans des fichiers doit être identique à l'un des résultats possibles qui l'exécution du programme en fonction de la sémantique abstraite aurait produit.

- L'entrée et la sortie de la dynamique de dispositifs interactifs prennent place dans une telle manière que les invites la sortie est en fait livré avant un programme attend d'entrée. Ce qui constitue un dispositif interactif la mise en œuvre est définie.

Ces sont collectivement dénommés les comportements observables du programme. [ Note: Plus strictes les correspondances entre l'abstrait et le réel de la sémantique peut être défini par chaque application. -fin note ]


Existe-il des situations où cette règle ne s'applique pas?

Au meilleur de ma connaissance, la seule exception pour le "comme-si" la règle est de copier/déplacer des élision, ce qui est admis, même si le constructeur de copie, déplacer le constructeur ou le destructeur d'une classe ont des effets secondaires. Les conditions exactes de ce sont spécifiées dans le Paragraphe 12.8/31:

Lorsque certains critères sont respectés, une mise en œuvre est permis d'omettre de le copier/déplacer construction d'une classe objet, même si le constructeur sélectionné pour la copie/déplacement de l'opération et/ou le destructeur de l'objet avoir des effets secondaires. [...]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X