Абстрактне пояснення
І C, і C ++ мають поняття абстрактної машини . Коли в коді використовується значення деякої змінної, абстрактна машина каже, що реалізація має отримати доступ до значення цієї змінної. Код форми statement_A; statement_B; statement_C;
повинен бути виконаний у точно визначеному порядку. Вирази, спільні для цих трьох тверджень, повинні бути перераховані щоразу, коли вони виникають.
На абстрактних машинах, враховуючи послідовність висловлювань statement_A; statement_B; statement_C;
, реалізація спочатку повинна виконуватись statement_A
у повному обсязі, потім statement_B
, і нарешті statement_C
. Реалізація не може пам'ятати, що ви присвоїли age
значення 5. Кожне твердження, що посилається, age
замість цього має отримати доступ до значення цієї змінної.
volatile
Ключове слово не буде необхідним, якщо реалізація строго виконується кодом C або C ++ відповідно до технічних характеристик абстрактних машин. Анотаційні машини C і C ++ не мають поняття регістрів, не мають загальних піддепресій, а порядок виконання - строгий.
В обох мовах також є ніби правила. Реалізація відповідає стандарту до тих пір, поки ця реалізація веде себе так, ніби виконувала речі відповідно до абстрактних специфікацій машини. Компілятор може припустити, що енергонезалежні змінні не змінюють значення між призначеннями. Поки це не порушує as-if
правило, послідовність statement_A; statement_B; statement_C;
може бути реалізована, виконавши частину statement_C
, потім частину statement_A
, потім все statement_B
, потім решту statement_A
і, нарешті, решту statement_C
.
Ці правила, ніби не застосовуються до volatile
змінних. Що стосується volatile
змінних та функцій, то реалізація повинна виконувати саме те, що ви їй наказали робити, і саме в тому порядку, в якому ви їй сказали робити речі.
Існує зворотний бік у специфікації абстрактних машин: це повільно. Одним із позитивних аспектів C та C ++ порівняно з іншими мовами є те, що вони досить швидкі. Це не було б випадком, якби код виконувався на цих абстрактних машинах. Правила -ніби - це те, що дозволяє C і C ++ бути настільки швидкими.
Відповідь ELI5
що це означає, коли компілятор не «оптимізує» адресу пам'яті?
"Оптимізація" пам'яті адреси - це вдосконалене поняття, те, що не входить у сферу можливостей п'ятирічного віку. Сумісні п’ятирічні діти зроблять саме те, що ви їм скажете робити, ні більше, ні менше. З volatile
, ви говорите, що реалізація повинна діяти так, як її п’ять: Ніякого мислення, не фантазійних оптимізацій. Натомість реалізація повинна робити саме те, що код пропонує їй зробити.
volatile
змінної, і він говорить про 5, і ви читаєте його знову в наступному році, ви гарантовано отримаєте 6.