При внедрении незакрепленных структур данных и кода синхронизации часто необходимо подавить оптимизацию компилятора. Обычно люди делают это с помощью asm volatile
с memory
в списке clobber, но иногда вы видите только asm volatile
или просто простую клавущую память asm
.
Какое влияние оказывают эти разные утверждения на генерацию кода (особенно в GCC, поскольку вряд ли он переносится)?
Для справки, это интересные варианты:
asm (""); // presumably this has no effect on code generation
asm volatile ("");
asm ("" ::: "memory");
asm volatile ("" ::: "memory");