Comportement défini par l'implémentation et comportement non défini
La norme C++ est très spécifique quant aux effets de diverses constructions, et en particulier vous devriez toujours être conscient de ces catégories de problème :
-
Un comportement non défini signifie qu'il n'y a absolument aucune garantie donnée. Le code peut fonctionner, ou mettre le feu à votre disque dur ou à votre ordinateur. faire sortir des démons de votre nez . En ce qui concerne le langage C++, absolument tout peut arriver. En termes pratiques, cela signifie généralement que vous avez un bogue irrécupérable. Si cela arrive, vous ne pouvez pas vraiment faire confiance à tout ce qui est à propos de votre application (car l'un des effets de ce comportement indéfini pourrait simplement avoir été de perturber la mémoire utilisée par le reste de votre application). Il n'est pas nécessaire d'être cohérent, donc exécuter le programme deux fois peut donner des résultats différents. Il peut dépendre des phases de la lune, de la couleur de la chemise que vous portez, ou de n'importe quoi d'autre.
-
Un comportement non spécifié signifie que le programme doit faire quelque chose de sain et de cohérent, mais qu'il n'est pas obligé de document ceci.
-
Le comportement défini par l'implémentation est similaire à celui non spécifié, mais doit également être documenté par les auteurs du compilateur. Un exemple de ceci est le résultat d'un reinterpret_cast
. généralement il change simplement le type d'un pointeur, sans modifier l'adresse, mais le mappage est en fait défini par l'implémentation, de sorte qu'un compilateur peut être amené à modifier le type d'un pointeur. pourrait à une adresse complètement différente, à condition que ce choix soit documenté. Un autre exemple est la taille d'un int. La norme C++ ne se soucie pas de savoir s'il s'agit de 2, 4 ou 8 octets. doit être documenté par le compilateur
Mais le point commun de tous ces éléments est qu'il vaut mieux les éviter. Dans la mesure du possible, adoptez un comportement qui est spécifié à 100 % par la norme C++ elle-même. De cette façon, la portabilité est garantie.
Vous devez souvent vous appuyer sur un comportement défini par l'implémentation. Cela peut être inévitable, mais vous devez tout de même y prêter attention, et être conscient que vous vous appuyez sur quelque chose qui peut changer entre différents compilateurs.
Un comportement indéfini, en revanche, devrait toujours être évitée. En général, vous devez partir du principe que cela fait exploser votre programme d'une manière ou d'une autre.
9 votes
Si vous décidez d'annuler les modifications apportées par quelqu'un d'autre, assurez-vous que votre orthographe, votre ponctuation et votre grammaire sont parfaites. Il est inutile d'annuler des modifications qui constituent une amélioration substantielle du texte original.