2015-05-11 2 views
0

Каково определение времени компиляции и времени выполнения в C? Я знаю, что sizeof() является оператором времени компиляции в C, но которые являются операторами времени выполнения в C?Операторы времени выполнения в C

+0

Все, что зависит от значения операнда, например '+' и '*'. – Barmar

+0

@LPs Ответы, по-видимому, не о операторах. – Barmar

+0

примечание: легче перечислить те, которые оцениваются во время компиляции ... –

ответ

0

компилирования операторы времени -> Рассчитано во время компиляции

операторов время выполнения -> Во время выполнения

Пример:

ВХОД А, В

С = А + В

Здесь + - оператор времени выполнения, поскольку он зависит от введенных значений.

1

Для C; различные оптимизации (например, постоянное распространение и постоянное сгибание) означают, что каждый оператор потенциально может быть выполнен во время компиляции (если это позволяет ситуация).

Для простого примера рассмотрим эту функцию:

int foo(int a, int b) { 
    return a+b; 
} 

Это выглядит как должно быть сделано во время выполнения добавления.

Теперь рассмотрим этот код:

int x = foo(1, 2); 

Теперь компилятор может «инлайн» функция, размножать константы, и сделать добавление во время компиляции. В итоге вы получите int x = 3; (плюс потенциально избыточная копия функции foo(), которая может выполнять добавление во время выполнения).

Есть также случаи, когда оптимизация не может быть выполнена во время компиляции, но может быть выполнена при связывании (с LTO/Link Time Optimization); где оператор не оценивается во время компиляции или времени выполнения. Простым примером может служить код в другом объектном файле («единица компиляции») int x = foo(1, 2);.

Также верно и обратное: ничто не гарантирует, что оператор будет оцениваться во время компиляции, когда это возможно; поэтому вы не можете сказать, что оператор всегда «компилирует время». Для простого примера рассмотрим объединение строк (например, char *myString = "Hello " "World!";) - было бы законным для компилятора генерировать код, который выполняет конкатенацию во время выполнения (хотя трудно подумать о причине, по которой компилятор захочет).

Смежные вопросы