Я сформулирую свою проблему в очень упрощенной форме, которая:
Если я набираю 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;
}
Я спрашиваю об этом, потому что я слышал о оптимизации компилятора, но это не моя область.
Любые комментарии, отзывы будут высоко оценены. Спасибо.
Поскольку вы спрашиваете о "оптимизации кода" - хороший оптимизирующий компилятор оптимизирует этот код до void main(){}
. a
и b
будут полностью устранены.
Кроме того, 7/2 == 3
, а не 3.5
Компиляция переведет язык высокого уровня на более низкий язык, например сборку. Хороший компилятор может оптимизировать, и это может быть настраиваемо (например, с -O2
) или так.
Что касается вашего кода, double b=7/2;
даст 3.0
вместо 3.5
, потому что вы выполняете целочисленную и целую операцию. Если вы хотите иметь 3.5
, вы должны сделать это как double b=7.0/2.0;
, Это довольно распространенная ошибка, которую люди делают.
Что произойдет, когда я нажимаю компиляцию?
Никто не знает. Компилятор может оптимизировать его до константы, а может и нет. Это, вероятно, будет, но этого не требуется.
Вы вообще не должны беспокоиться или даже думать о оптимизации компилятора, если только вы не в состоянии, которое ему абсолютно необходимо, что очень мало разработчиков. Компилятор обычно может сделать лучше, чем вы можете.
Я ничего не знаю об оптимизации, но я решил сделать это. Использование gcc -c -S test.c
меня есть сборка для функции. Здесь int a = 3 + 2
строка int a = 3 + 2
.
movl $5, -4(%rbp)
Поэтому для меня это преобразование значения (3 + 2) в 5 во время компиляции, но это зависит от компилятора и платформы и от любых флагов, которые вы передаете.
(Кроме того, я сделал функцию, возвращающую просто так, что он не будет оптимизировать код полностью.) a
int main()
,double b=7/2
, b равно 3,0, а не 3,5.