«Время компиляции» или «Компиляция» - это одна часть процесса. В C ++ есть функция, называемая макросами, которая разворачивается в код C ++ на этапе предварительной обработки. Эта стадия препроцессора выполняется в первую очередь перед компилятором. В зависимости от компилятора следующим шагом является преобразование читаемого человеком кода C ++ в другую форму, удобочитаемую для машин. Это действительно зависит от типа компилятора и других возможных аргументов, передаваемых во время компиляции, относительно того, во что это превращается. Для простоты предположим, что компилятор компилирует C ++ в символы / сборку / машинный код. Каждый из этих файлов является независимым, из-за отсутствия лучшего термина.
Последний шаг - связать их вместе. Включает, предварительные декларации и внешние решения решаются на этом этапе. Некогда независимые файлы теперь «связаны» с размерами типов / классов / структур, известных в конце этапа. После того, как все это сделано, формируется исполняемый файл, для которого он является чисто машинным языком и понимается компьютером, на котором выполняется программа.
Общее правило программирования на C ++ - вы хотите отлавливать как можно больше ошибок во время компиляции. Время выполнения - это промежуток времени, в течение которого ваша программа выполняет машинный код. Это может включать в себя распределение кучи, динамическое изменение списка c и т. Д. c ...
Теперь, к сути вашего вопроса. В чем разница между постоянной времени выполнения постоянной и постоянной времени компиляции ? Это довольно просто. Время компиляции Константы - это значения, известные и разрешаемые во время компиляции. Эти значения могут быть определены и рассчитаны и не зависят от внешнего ввода пользователя или данных файла. См. Constexpr как хороший справочник для получения дополнительной информации о константах времени компиляции: ConstExprLink .
const int userScore = 3; // Compile time constant
const int secondUserScore = 5; // Compile time constant
constexpr int CombinedUserScores = ( userScore + secondUserScore ); // Also compile constant because all values are known at compile time
Однако есть некоторые константы, которые не могут быть известны во время компиляции. Эти значения могут быть определены и разрешены после запуска вашей программы Run-Time . Теперь, напротив, представьте, что вы читаете вводимые пользователем данные или данные из файла во время выполнения
std::cout << "Enter your Test Score: ";
const int testScore = 0;
std::cin >> testScore; // User sets an input value during Run-Time
const int userScore { testScore }; // Run-Time constant. No way to know the value at compile time
userScore теперь является постоянной времени выполнения, которую нельзя изменить, если вы не участвуете в каких-то табу, таких как const_cast или стиль каста C. Дело в том, что компилятор не может знать, каким будет значение этой константы, пока не будет прочитан ввод. Это часто называется программированием на основе данных и является очень распространенной парадигмой. Кроме того, поскольку const Run-Time не определяется во время компиляции, constexpr не может использоваться здесь .
Выше приведен пример Run Время константа. Это значение не может быть разрешено во время компиляции, потому что компилятор не знает, какой может быть ввод от пользователя или файла. Вот еще одна полезная ссылка: CompileTimeConstant и RunTimeConstant