Mam następujący prosty program, którego używam do odświeżenia mojej pamięci GDB (której nie dotykałem od wielu lat).Zmiany GCC mniejsze niż lub mniejsze niż
#include <stdio.h>
int main()
{
int i;
for (i = 0; i < 10; i++)
{
printf("Hello World\n");
}
return 0;
}
Kompiluję to z gcc -g for-test.c -o for-test
. Na podstawie strony podręcznika nie oczekuję żadnych optymalizacji, ponieważ nie określiłem żadnego.
Kiedy załadować to do GDB i uruchomić disassemble main
porównanie i < 10
generuje następujące:
cmp DWORD PTR [rbp-0x4],0x9
jle 0x4004fe <main+10>
Wydaje skutecznie zmieniły porównanie i < 10
do i <= 9
. Biorąc pod uwagę, że są to porównania całkowite, nie powinno być różnicy, ale zastanawiałem się, czy istnieje jakiś powód, dla którego GCC wyprowadza to zgromadzenie, zamiast porównywania z 10 i skakania, jeśli jest mniejsze niż (JL)?
Edytuj: To jest na komputerze z procesorem 64-bitowym, z systemem Ubuntu z GCC 4.6.3 i GDB 7.4-2012.04.
Obie metody są w 100% identyczne (to samo zachowanie, ten sam rozmiar kodu, ta sama szybkość na każdym procesorze). Nie wiem o wewnętrznych elementach GCC, więc nie mogę zgadnąć, dlaczego tak się stało. Bardziej interesujące jest to, że nie wydaje mi się, że włączyłeś optymalizację (w przeciwnym razie użyłbym rejestru zamiast zmiennej lokalnej dla 'i'). – Brendan
Być może w ten sposób normalizuje porównania .. – harold
Jeśli istniała jakakolwiek szansa, że te dwie wartości nie będą takie same, nie zrobiłoby to tego bez optymalizacji. na przykład 'if (a + 1> 1)' zostanie uproszczone do 'if (a> 0)' z optymalizacją, ale jest potencjalnie niebezpieczne, więc nie zostanie wykonane inaczej. – teppic