Función volátil

Resumen: ¿Qué hace la palabra clavevolatile ¿Cuando se aplica a una declaración de función en C y en C ++?

Detalles:

Veo que es posible compilar una función que está marcada comovolatile. Sin embargo, no estoy seguro de qué optimización del compilador (si existe) evita esto. Por ejemplo, he creado el siguiente caso de prueba:

volatile int foo() {
  return 1;
}

int main() {
  int total = 0;
  int i = 0;
  for(i = 0; i < 100; i++) {
    total += foo();
  }

  return total;
}

Cuando compilo conclang -emit-llvm -S -O3 test.c (gcc también funcionaría, pero en mi opinión, el llvm IR es más legible) Recibo:

target triple = "x86_64-unknown-linux-gnu"

define i32 @foo() #0 {
  ret i32 1
}

define i32 @main() #0 {
  ret i32 100
}

Así que obviamente el compilador fue capaz de optimizar las llamadas para funcionarfoo() así que esomain() devuelve una constante, aunquefoo() está marcado comovolatile. Así que mi pregunta es sivolatile hace cualquier cosa cuando se aplica a una declaración de función en términos de limitar las optimizaciones del compilador.

(Tenga en cuenta que mi interés en esta pregunta es principalmente curiosidad por entender quévolatile hace en lugar de resolver cualquier problema específico.)

(También he marcado esta pregunta como C y C ++ no porque creo que son el mismo lenguaje, sino porque me interesa saber si hay diferencias en lo quevolatile hace en este caso en estos dos idiomas).

Respuestas a la pregunta(2)

Su respuesta a la pregunta