Ho il seguente semplice programma che sto usando per rinfrescare la memoria di GDB (che non ho toccato per molti anni).GCC cambia meno di o uguale a
#include <stdio.h>
int main()
{
int i;
for (i = 0; i < 10; i++)
{
printf("Hello World\n");
}
return 0;
}
Compilare questo con gcc -g for-test.c -o for-test
. In base alla pagina man, non mi aspetto alcuna ottimizzazione da utilizzare, poiché non ne ho specificato nessuna.
Quando carico questo in GDB e corro disassemble main
, il confronto i < 10
genera il seguente:
cmp DWORD PTR [rbp-0x4],0x9
jle 0x4004fe <main+10>
Questo sembra avere cambiato in modo efficace un confronto di i < 10
-i <= 9
. Dato che si tratta di confronti interi, non dovrebbe esserci una differenza, ma mi chiedevo se c'è qualche motivo per cui GCC emette questo assembly, invece di confrontarlo con 10 e saltando se inferiore a (JL)?
Modifica: questo è su una macchina con un processore a 64 bit, che esegue Ubuntu con GCC 4.6.3 e GDB 7.4-2012.04.
Entrambi i modi sono identici al 100% (stesso comportamento, stessa dimensione del codice, stessa velocità su ogni CPU). Non conosco gli interni di GCC, quindi non riesco a indovinare perché lo abbia fatto. Più interessante è che non penso che tu abbia abilitato l'ottimizzazione (altrimenti userebbe un registro invece di una variabile locale per 'i'). – Brendan
Forse è così che normalizza i confronti .. – harold
Se ci fosse qualche possibilità che i due non fossero gli stessi, non lo farebbe senza l'ottimizzazione. per esempio. 'if (a + 1> 1)' sarà semplificato a 'if (a> 0)' con l'ottimizzazione, ma è potenzialmente pericoloso, quindi non sarà fatto altrimenti. – teppic