У меня есть следующая простая программа, которую я использую, чтобы обновить мою память о GDB (которую я не касался много лет).GCC меняется меньше или меньше
#include <stdio.h>
int main()
{
int i;
for (i = 0; i < 10; i++)
{
printf("Hello World\n");
}
return 0;
}
Скомпилируйте это с помощью gcc -g for-test.c -o for-test
. Основываясь на странице руководства, я не ожидаю, что какие-либо оптимизации будут использованы, поскольку я не указал их.
Когда я загружаю это в GDB и запустить disassemble main
, то i < 10
сравнение генерирует следующее:
cmp DWORD PTR [rbp-0x4],0x9
jle 0x4004fe <main+10>
Это, кажется, эффективно изменили сравнение i < 10
к i <= 9
. Учитывая, что это целые сравнения, не должно быть разницы, но мне было интересно, есть ли какая-либо причина, по которой GCC выводит эту сборку, вместо сравнения с 10 и прыжками, если меньше (JL)?
Редактировать: Это на машине с 64-разрядным процессором, работающим под управлением Ubuntu с GCC 4.6.3 и GDB 7.4-2012.04.
Оба способа на 100% идентичны (одинаковое поведение, одинаковый размер кода, одинаковая скорость для каждого процессора). Я не знаю о внутренних компонентах GCC, поэтому не могу догадаться, почему это произошло. Более интересно то, что я не думаю, что вы включили оптимизацию (в противном случае он будет использовать регистр вместо локальной переменной для 'i'). – Brendan
Возможно, это так, как это нормализует сравнения .. – harold
Если бы были какие-то шансы, что они не будут одинаковыми, это не сделает это без оптимизации. например 'if (a + 1> 1)' будет упрощен до 'if (a> 0)' с оптимизацией, но это потенциально небезопасно, поэтому не будет сделано иначе. – teppic