Explication abstraite
C et C ++ ont tous deux un concept de machine abstraite . Lorsque le code utilise la valeur d'une variable, la machine abstraite indique que l'implémentation doit accéder à la valeur de cette variable. Le code du formulaire statement_A; statement_B; statement_C;
doit être exécuté exactement dans l'ordre spécifié. Les expressions communes à ces trois instructions doivent être recalculées chaque fois qu'elles se produisent.
Selon les machines abstraites, compte tenu de la séquence d'instructions statement_A; statement_B; statement_C;
, l'implémentation doit d'abord effectuer statement_A
dans son intégralité, puis statement_B
, et enfin statement_C
. L'implémentation ne se souvient pas que vous avez attribué age
la valeur 5. Chaque déclaration que les références age
doivent plutôt accéder à la valeur de cette variable.
Le volatile
mot clé ne serait pas nécessaire si les implémentations exécutaient strictement du code C ou C ++ selon les spécifications de la machine abstraite. Les machines abstraites C et C ++ n'ont aucun concept de registres, aucun concept de sous-expressions communes et l'ordre d'exécution est strict.
Les deux langues ont aussi que, si les règles. Une implémentation est conforme à la norme tant qu'elle se comporte comme si elle avait exécuté des choses conformément à la spécification de machine abstraite. Le compilateur peut supposer que les variables non volatiles ne modifient pas les valeurs entre les affectations. Tant qu'elle ne viole pas la as-if
règle, la séquence statement_A; statement_B; statement_C;
peut être implémentée en exécutant une partie de statement_C
, puis une partie de statement_A
, puis tout statement_B
, puis le reste statement_A
et enfin le reste de statement_C
.
Ceux que, si les règles ne sont pas applicables à des volatile
variables. En ce qui concerne les volatile
variables et les fonctions, une implémentation doit faire exactement ce que vous lui avez dit de faire, et exactement dans l'ordre dans lequel vous lui avez dit de faire les choses.
Il y a un inconvénient à la spécification abstraite de la machine: c'est lent. Un aspect positif de C et C ++ par rapport à d'autres langages est qu'ils sont assez rapides. Ce ne serait pas le cas si le code était exécuté par ces machines abstraites. Les que, si les règles sont ce qui permettent C et C ++ pour être si rapide.
Réponse ELI5
qu'est-ce que cela signifie lorsque le compilateur n'optimise pas l'adresse mémoire?
«Optimiser» une adresse mémoire est un concept avancé, quelque chose qui ne relève pas des capacités d'un enfant de cinq ans. Les enfants de cinq ans conformes feront exactement ce que vous leur dites de faire, ni plus, ni moins. Avec volatile
, vous dites à l'implémentation d'agir comme si elle était cinq: pas de réflexion, pas d'optimisations sophistiquées. Au lieu de cela, l'implémentation doit faire exactement ce que le code lui dit de faire.
volatile
variable et qu'il est dit 5, et que vous le