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");

questionAnswers(3)

yourAnswerToTheQuestion