volatile int num = 0;
num = num + 10;
Вышеупомянутый код С++, похоже, создает следующий код в сборке intel:
mov DWORD PTR [rbp-4], 0
mov eax, DWORD PTR [rbp-4]
add eax, 10
mov DWORD PTR [rbp-4], eax
Если я сменил код на С++ на
volatile int num = 0;
num = num + 0;
почему компилятор не производит код сборки как:
mov DWORD PTR [rbp-4], 0
mov eax, DWORD PTR [rbp-4]
add eax, 0
mov DWORD PTR [rbp-4], eax
gcc7.2 -O0
оставляет вне add eax, 0
, но все остальные инструкции одинаковы (Godbolt).
В какой части процесса компиляции этот трехмерный код удаляется. Есть ли какой-либо флаг компилятора, который заставит компилятор GCC не выполнять такие оптимизации.