Różnica między asm, asm volatile i clobbering memory
Podczas implementacji struktur danych bez kodu blokady i kodu czasowego często konieczne jest wyeliminowanie optymalizacji kompilatora. Normalnie ludzie robią to za pomocąasm volatile
zmemory
na liście clobber, ale czasami widzisz tylkoasm volatile
lub po prostu zwykłyasm
pstrykanie pamięci.
Jaki wpływ mają te różne stwierdzenia na generowanie kodu (szczególnie w GCC, ponieważ jest mało prawdopodobne, że będzie przenośny)?
Dla porównania, są to interesujące wariacje:
asm (""); // presumably this has no effect on code generation
asm volatile ("");
asm ("" ::: "memory");
asm volatile ("" ::: "memory");