recientemente, estoy buscando en códigos de montaje para #define, const y enumeración:ayuda para entender las diferencias entre #define, const y enum en C y C++ en el nivel de conjunto
códigos C (#define):
3 #define pi 3
4 int main(void)
5 {
6 int a,r=1;
7 a=2*pi*r;
8 return 0;
9 }
códigos de montaje (para la línea 6 y 7 en los códigos c) generado por GCC:
6 mov $0x1, -0x4(%ebp)
7 mov -0x4(%ebp), %edx
7 mov %edx, %eax
7 add %eax, %eax
7 add %edx, %eax
7 add %eax, %eax
7 mov %eax, -0x8(%ebp)
códigos C (enum):
2 int main(void)
3 {
4 int a,r=1;
5 enum{pi=3};
6 a=2*pi*r;
7 return 0;
8 }
códigos de montaje (para la línea 4 y 6 en los códigos c) generado por GCC:
6 mov $0x1, -0x4(%ebp)
7 mov -0x4(%ebp), %edx
7 mov %edx, %eax
7 add %eax, %eax
7 add %edx, %eax
7 add %eax, %eax
7 mov %eax, -0x8(%ebp)
códigos C (const):
4 int main(void)
5 {
6 int a,r=1;
7 const int pi=3;
8 a=2*pi*r;
9 return 0;
10 }
códigos de montaje (para la línea 7 y 8 en c códigos) generados por GCC:
6 movl $0x3, -0x8(%ebp)
7 movl $0x3, -0x4(%ebp)
8 mov -0x4(%ebp), %eax
8 add %eax, %eax
8 imul -0x8(%ebp), %eax
8 mov %eax, 0xc(%ebp)
i encontraron que el uso #define
y enum
, la asse Los códigos de Mbly son iguales. El compilador usa 3 instrucciones de agregar para realizar la multiplicación. Sin embargo, cuando se usa const
, se usa la instrucción imul. ¿Alguien sabe la razón detrás de eso?
¿Qué versión de gcc y qué indicadores de optimización? –
gcc (GCC) 4.4.2 20091222 (Red Hat 4.4.2-20) No especifiqué el indicador de optimización (predeterminado). – martin