di recente, sto cercando in codici di assemblaggio per #define, const e enum:aiuto per capire le differenze tra #define, const e enum in C e C++ a livello di montaggio
codici 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 }
codici assembly (per la linea 6 e 7 codici c) generato da 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)
codici 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 }
codici assembly (per la linea 4 e 6 codici c) generato da 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)
codici 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 }
codici assembly (per la linea 7 e 8 in c codici) generati da 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)
ho trovato che l'uso #define
e enum
, l'asse i codici mbly sono gli stessi. Il compilatore usa 3 istruzioni per eseguire la moltiplicazione. Tuttavia, quando si utilizza const
, viene utilizzata l'istruzione imul. Qualcuno sa il motivo dietro a ciò?
Quale versione di gcc e quali flag di ottimizzazione? –
gcc (GCC) 4.4.2 20091222 (Red Hat 4.4.2-20) Non ho specificato il flag di ottimizzazione (predefinito). – martin