Различный внешний вид между SDCC и Keil с одинаковым кодом в 8051

Я пишу функцию задержки:

void delay(a){
    for (int i=a;i>0;i--) 
        for (int j=0; j<200;j++)
} 

Но когда я скомпилировал этот код с помощью sdcc и keil и запустил на чипе 8051. В результате функция задержки, скомпилированная sdcc, работает намного медленнее, чем функция, скомпилированная keil.

Может кто-нибудь сказать мне, почему...


person Jack    schedule 07.05.2021    source источник
comment
Потому что поведение, определяемое реализацией, определяется реализацией. Код, который вы показали, ничего не делает, поэтому компиляторы могут по-разному создавать код, который ничего не делает. Язык C не определяет, как долго будут выполняться операторы кода, поэтому оба компилятора могут быть согласованы и по-прежнему давать совершенно разные результаты.   -  person Jonathon Reinhart    schedule 07.05.2021
comment
Боковое примечание: ваш код не компилируется. -- В вашем посте отсутствуют данные о времени, которое вы получаете. -- Вы смотрели в получившийся машинный код? -- Какие командные строки вы использовали для компиляции? -- Какую версию компиляторов вы использовали?   -  person the busybee    schedule 07.05.2021


Ответы (1)


Разные компиляторы используют разные реализации на машинном языке. Есть несколько вопросов, не ограничиваясь, но то, что всплывает в моей голове:

  • Нет стандартного определения перевода в машинный код: каждый компилятор может использовать любое решение, соответствующее стандарту. Существует более одного возможного решения.
  • Различное поведение компилятора: у каждого компилятора есть собственный набор параметров для изменения конкретных вариантов генерации.
  • Уровни оптимизации: например, пустой цикл может быть полностью оптимизирован.
  • Распределение переменных: компиляторы могут свободно выбирать регистры или ячейки ОЗУ для использования в своих переменных.
  • Разрядность (в вашем случае) int: Вероятно, она одинакова с SDCC и Keil, но иногда есть различия.
person the busybee    schedule 07.05.2021