Компиляция и оптимизация кода

0

Я сформулирую свою проблему в очень упрощенной форме, которая:

Если я набираю C

void main(){
 int a=3+2;
 double b=7/2;
}

Когда a и b будут назначены их значения 5 и 3.5, это когда я компилирую свой код или это когда я запускаю код?

Другими словами, что произойдет, когда я нажимаю компиляцию? и как он отличается от случая, когда я нажимаю клавишу, с точки зрения назначения значений и выполнения вычислений, и как это отличается от написания моего кода:

void main(){
 int a=5;
 double b=3.5;
}

Я спрашиваю об этом, потому что я слышал о оптимизации компилятора, но это не моя область.

Любые комментарии, отзывы будут высоко оценены. Спасибо.

  • 1
    en.wikipedia.org/wiki/Constant_folding
  • 1
    int main() , double b=7/2 , b равно 3,0, а не 3,5.
Показать ещё 3 комментария
Теги:
compiler-optimization
compilation

5 ответов

7

Поскольку вы спрашиваете о "оптимизации кода" - хороший оптимизирующий компилятор оптимизирует этот код до void main(){}. a и b будут полностью устранены.

Кроме того, 7/2 == 3, а не 3.5

2

Компиляция переведет язык высокого уровня на более низкий язык, например сборку. Хороший компилятор может оптимизировать, и это может быть настраиваемо (например, с -O2) или так.

Что касается вашего кода, double b=7/2; даст 3.0 вместо 3.5, потому что вы выполняете целочисленную и целую операцию. Если вы хотите иметь 3.5, вы должны сделать это как double b=7.0/2.0; , Это довольно распространенная ошибка, которую люди делают.

1

Он зависит от компилятора, хороший будет делать CF и/или DCE

  • 1
    На самом деле, хороший компилятор все оптимизирует. У этого кода нет побочных эффектов, так что, в конце концов, основная функция ничего не делает.
  • 0
    Спасибо за ваш ответ. Я спрашиваю об этом, потому что это часть реального сценария, который намного сложнее, потому что вычисления выполняются 8-битным микроконтроллером (каждый шаг вычислений влияет на общее время выполнения).
Показать ещё 1 комментарий
1

Что произойдет, когда я нажимаю компиляцию?

Никто не знает. Компилятор может оптимизировать его до константы, а может и нет. Это, вероятно, будет, но этого не требуется.

Вы вообще не должны беспокоиться или даже думать о оптимизации компилятора, если только вы не в состоянии, которое ему абсолютно необходимо, что очень мало разработчиков. Компилятор обычно может сделать лучше, чем вы можете.

  • 0
    Сказать «Никто не знает» не является ни полезным, ни правдой. Хотя это зависит от уровня оптимизации компилятора, компиляторы ведут себя детерминистски. Обычно вы можете догадаться, что произойдет для простых случаев, и вы всегда можете посмотреть на сгенерированную сборку, если это важно.
  • 1
    Никто, кроме тех, кто получил документацию
1

Я ничего не знаю об оптимизации, но я решил сделать это. Использование gcc -c -S test.c меня есть сборка для функции. Здесь int a = 3 + 2 строка int a = 3 + 2.

movl    $5, -4(%rbp)

Поэтому для меня это преобразование значения (3 + 2) в 5 во время компиляции, но это зависит от компилятора и платформы и от любых флагов, которые вы передаете.

(Кроме того, я сделал функцию, возвращающую просто так, что он не будет оптимизировать код полностью.) a

  • 0
    Хороший, спасибо.
  • 0
    @ Андерсон, не то, что Остину это важно (он может, я не знаю), но если его комментарий был полезен, дайте ему ответный щелчок :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню