Что делает C (++) со значениями, которые не хранятся в переменных? - PullRequest
15 голосов
/ 30 января 2010

Мне немного любопытно, как C и C ++ обрабатывают данные, которые не хранятся в переменных, например:

int IE6_Bugs = 12345;
int Win_Bugs = 56789;

Да - все ясно. IE6_Bugs имеет 123456, сохраненных по определенному адресу памяти.

Тогда как насчет ..

if ( IE6_Bugs + Win_Bugs > 10000 )
{
  // ...

Итак, C берет значения двух переменных и добавляет их, чтобы сравнить результат с int справа.

Но:

  • Достигает ли IE6_Bugs+Win_Bugs ОЗУ? Или процессор напрямую сравнивает значения через собственный кеш?

  • Или в процессе компиляции приведенный выше оператор if преобразован в нечто более «понятное» для машины? (Может сначала вычислить IE6_Bugs+Win_Bugs и сохранить его в некоторой переменной, ...)

Ответы [ 6 ]

18 голосов
/ 30 января 2010

Он будет помещен в регистр в CPU (при условии, что он доступен).Регистр - это своего рода сверхбыстрая сверхмалая оперативная память, встроенная в сам ЦП и используемая для хранения результатов промежуточных операций.

Если можно определить, что значение всегда равно xxx, тогда умный компилятор заменитзначение xxx на его месте.

Имейте в виду, что независимо от того, является ли оно выражением или числом, (x + y против 10) оно будет все же должно быть размещенов регистр, чтобы процессор мог получить к нему доступ и выполнить операцию на основе его значения.

Для получения дополнительной информации ознакомьтесь с архитектурой компьютера.

8 голосов
/ 30 января 2010

В общем случае генератор кода кодирует такие значения непосредственно в инструкциях («немедленная адресация») или сохраняет их в сегменте данных программы для загрузки по мере необходимости.

Оптимизация, известная как «постоянное сворачивание», вычисляет значения постоянных выражений во время компиляции. В вашем конкретном примере умный компилятор распознает, что ваше условие всегда будет истинным, и избегает генерации кода для теста, поэтому значения 12345, 56789 и 10000 могут вообще не быть представлены в машинном коде, созданном для вашей программы. 1003 *

Ваш компилятор, вероятно, имеет возможность сохранить промежуточный язык ассемблера, сгенерированный для вашей программы, , например, , g++ -S. Узнайте немного об архитектуре и языке ассемблера вашего процессора, чтобы понять и даже сделать полезные выводы из этого вывода.

4 голосов
/ 30 января 2010

Он помещает безымянные временные значения везде, где он помещает именованные переменные - обычно в стек. Как и в случае с именованными переменными, компилятор может разместить значения в регистрах ЦП для ускорения процесса. Если вы действительно заинтересованы в этом, вы должны взглянуть на выходные данные ассемблера, сгенерированные вашим компилятором.

4 голосов
/ 30 января 2010

Хорошо, хороший компилятор будет выполнять постоянное распространение и свертывание, поэтому в этом примере он заменит IE6_Bugs на 12345 и Win_Bugs на 56789, а затем преобразует это в 69134. Затем он, вероятно, также свернет 69134> 10000 в true 'и вообще удалить ветку, все во время компиляции.

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

2 голосов
/ 31 января 2010

Нет абсолютно никакого способа окончательно ответить на этот вопрос. Другие ответы здесь точны для большинства архитектур, но это не относится ни к одному из указанных стандартов C / C ++, которые не зависят от оборудования.

Порядок оценки определяется стандартом. Как вещи в конечном итоге обрабатываются в памяти, это не так.

0 голосов
/ 31 января 2010

Можно сказать, что нужно проверить сгенерированный ассемблерный код или просмотреть его в отладчике. Разные компиляторы могут делать это по-разному. Это также может зависеть от параметров компилятора, таких как «DEBUG».

Комментарии здесь о постоянном сворачивании и исключении теста «если» будут применяться, если декларации будут иметь префикс «const».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...