запутался по поводу констант времени компиляции - PullRequest
2 голосов
/ 19 апреля 2020

Как я читал в книге C ++, процесс g cc: предварительная обработка, Compiling, сборка и связывание.

Есть Compile Time константы и Run Time константы. Тогда я запутался в «компиляции» и «времени компиляции». Скажите, пожалуйста, что означает "время компиляции" в процессе g cc, это вся предварительная обработка, Compiling, сборка и компоновка?

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Ниже описаны различные шаги:

Предварительная обработка: Это как раз когда текст буквально заменяется. Например, когда вы #include заголовок, все содержимое этого файла сбрасывается прямо в этом месте. Предварительная обработка может также использоваться для создания «констант времени компиляции» с #define, но это не рекомендуется для современного C ++.

Компиляция: Чтобы объяснить это просто ( в этом много нюансов), это когда ваш код превращается в машинные инструкции для архитектуры, для которой вы компилируете.

Сборка / связывание: Это несколько не имеет отношения к вопросу, но они являются последним шагом к объединению частей программы для конечного исполняемого файла.

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

Возьмите, например, число pi. Вычисление этого значения до 20-го числа git занимает немного времени, но если оно было объявлено как постоянная времени компиляции (например, constexpr double pi = 3.14159...), это бесплатно и также может быть смешано с любыми вычислениями времени компиляции. Подобные вещи значительно расширены в последних стандартах.

Константы времени выполнения нельзя использовать в вычислениях во время компиляции, потому что их значение неизвестно во время компиляции. const используется в качестве ограничения для обеспечения невозможности изменения какой-либо переменной, что очень часто встречается в параметрах функции для приема ссылок только для чтения.

0 голосов
/ 19 апреля 2020

«Время компиляции» или «Компиляция» - это одна часть процесса. В 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

...