Cuando se usa una instrucción continue dentro de un bucle en código C, GCC crea una nueva etiqueta con una instrucción nop justo antes del final del bloque de bucle y salta hacia ella, en lugar de saltar hasta el final del bloque de bucle en sí. Por ejemplo, el siguiente código CConjunto generado por GCC equivalente a instrucción continue en C
for (i=0; i<10; i++) {
puts("blah\n");
if (i < 10) continue;
puts("This shouldn't be printed.\n");
}
produce los siguientes equivalente ASM (usando -S gcc):
movl $0, 28(%esp)
jmp L2
L5:
movl $LC0, (%esp)
call _puts
cmpl $9, 28(%esp)
jle L7
L3:
movl $LC1, (%esp)
call _puts
jmp L4
L7:
nop
L4:
incl 28(%esp)
L2:
cmpl $9, 28(%esp)
jle L5
(El si (i < se inserta 10) parte para que el compilador doesn' t "optimizar" la sección eliminando lo que sigue a la instrucción continue)
Mi pregunta es, ¿por qué no saltar directamente a L4? IMO podríamos pasar a L4, ¿me estoy perdiendo algo?
Gracias por la respuesta rápida! -O1 hizo el truco, aunque el flujo del programa después de la optimización parece algo menos intuitivo ahora, a menos que esté equivocado, el bucle parece parcialmente desenrollado ahora. Ahora tengo curiosidad sobre si hay algún incentivo para crear la etiqueta con la instrucción nop. ¿Hay alguna situación en la que este enfoque evite que ocurra algo si se quiere saltar directamente a L4? – susmits
Con fines de depuración, puede establecer un punto de interrupción en la etiqueta L7; sería difícil romper el caso continuo si no estuviera allí. – nos
@susmits: con -O1, el ensamblaje es menos detallado, pero el ciclo no se desenrolla (con -O3 puede ver la versión desenrollada, observe que ni siquiera incluye el control i <10 o el segundo puts()) . En general, crear la etiqueta y no realizar dichas optimizaciones ayuda mucho en la depuración. –