Explicação abstrata
C e C ++ têm o conceito de uma máquina abstrata . Quando o código usa o valor de alguma variável, a máquina abstrata diz que a implementação precisa acessar o valor dessa variável. O código do formulário statement_A; statement_B; statement_C;
deve ser executado exatamente na ordem especificada. Expressões comuns a essas três instruções devem ser recalculadas sempre que ocorrerem.
Pelas máquinas abstratas, dada a sequência de instruções statement_A; statement_B; statement_C;
, a implementação deve primeiro executar statement_A
em sua totalidade, depois statement_B
e finalmente statement_C
. A implementação não se lembra de que você atribuiu age
o valor 5. Toda declaração que referencia age
deve acessar o valor dessa variável.
Não haveria necessidade da volatile
palavra - chave se as implementações executassem estritamente o código C ou C ++ de acordo com as especificações abstratas da máquina. As máquinas abstratas C e C ++ não têm conceito de registradores, subexpressões comuns e a ordem de execução é rigorosa.
Ambos os idiomas também têm regras como se . Uma implementação é compatível com o padrão desde que ela se comporte como se tivesse executado coisas de acordo com a especificação abstrata da máquina. O compilador pode assumir que variáveis não voláteis não alteram valores entre atribuições. Desde que não quebre a as-if
regra, a sequência statement_A; statement_B; statement_C;
pode ser implementada executando parte de statement_C
, depois parte de statement_A
, depois todo statement_B
, depois o restante statement_A
e, finalmente, o restante statement_C
.
Essas regras como se não se aplicam a volatile
variáveis. No que diz respeito às volatile
variáveis e funções, uma implementação precisa fazer exatamente o que você pediu e exatamente na ordem em que você disse para fazer as coisas.
Há uma desvantagem na especificação abstrata da máquina: é lenta. Um aspecto positivo de C e C ++ em comparação com outras linguagens é que elas são bastante rápidas. Este não seria o caso se o código fosse executado por essas máquinas abstratas. Os COMO SE regras são o que permitirá C e C ++ para ser tão rápido.
Resposta ELI5
o que significa quando o compilador não "otimiza" o endereço de memória?
"Otimizar" um endereço de memória é um conceito avançado, algo que não se enquadra nas capacidades de uma criança de cinco anos. As crianças de cinco anos em conformidade farão exatamente o que você manda, nem mais nem menos. Com volatile
, você está dizendo à implementação para agir como se fosse cinco: sem pensar, sem otimizações sofisticadas. Em vez disso, a implementação precisa fazer exatamente o que o código diz.
volatile
variável e diz 5, e você lê-lo novamente no próximo ano, você está garantido para obter 6.