Я не обученный компьютерный ученый, поэтому я не знаю всех или большинства деталей относительно компиляции и т. Д., Но я всегда думал, что мои c-программы скомпилированы в машинный код, который я могу просматривать с помощью флага -S, используя НКА.Почему явный арифметический сдвиг битов приводит к большему файлу .s?
Я также думал, что чем ближе мой код похож на машинный код, тем быстрее компьютер сможет его выполнить. Поэтому я решил проверить это.
Я написал два тестовых файла для вычисления простой арифметической задачи.
// test1.c
int main(int argc, char* argv[]){
int x = 4243;
int y = 3235;
int z = 613*x + 725*y;
return 0;
}
// test2.c
int main(int argc, char* argv[]){
int x = 4243;
int y = 3235;
int z = (((((((x << 3) + x) << 1) + x) << 3) + x) << 2) + x +
(((((((((y << 2) + y) << 1) + y) << 2) + y) << 2) + y) << 2) + y;
return 0;
}
Я знаю, что я сделал этот пример гораздо более сложным, чем это необходимо, но когда я попробовал его с более простым примером, разница была не так ясна.
Теперь, если я компилирую с флагом ССАГПЗ -S, машинный код является 31 линии для test1.s и 47 линий с test2.s
Каковы возможные объяснения? Предполагается ли, что меньшее количество строк машинного кода означает более быстрое выполнение ошибок? Используется ли файл .s для чего-либо до создания двоичного файла? Является ли моя игрушка фиктивной?
Спасибо за любые идеи
Я не уверен, повлиял ли он на код сборки первой руки, но вы пробовали это с использованием любого уровня оптимизации? –
Недостаток вашего предположения о том, что он похож на машинный код == fast. Кроме того, не уверен, почему второй должен быть больше похож на машинный код ... –
Да, ваше предположение неверно. 1) инструкции не все принимают одно и то же время для выполнения 2) петли могут использовать меньшее количество инструкций, но повторяют их несколько раз. Часто более фактические письменные инструкции могут быть быстрее благодаря сочетанию двух. Затем процессор запускается и выполняет свои собственные действия. –