«Спасибо, сэр. Хм. Что произойдет, если все операнды будут именованными объектами, а не литералами? Будет ли это создавать временные объекты, так сказать, на лету, а не во время компиляции?»
Как упомянул Сэм, вы на правильном пути на высоком уровне. В вашем первом примере он будет использовать регистры ЦП для хранения временных объектов (поскольку они не являются именованными объектами), если они будут именованными объектами, это зависит от флагов оптимизации, установленных в компиляторе, и сложности кода относительно того, как «оптимизировано 'код будет сгенерирован. Вы можете взглянуть на разборку, чтобы действительно увидеть, что происходит. например, если вы делаете
a = 5;
b = 2;
c = a * b;
компилятор попытается сгенерировать наиболее оптимальный код, а поскольку в этом случае есть 2 константы, которые известны во время компиляции, и вы делаете умножение на 2, он сможет использовать ярлыки, иногда умножения заменяются битовыми операциями которые дешевле (умножить на 2 - это то же самое, что сдвинуть 1 влево)
именованные переменные должны где-то жить, либо в стеке, либо в куче, и ЦП будет использовать адрес именованных объектов, чтобы передавать их и выполнять над ними функции. (если они достаточно малы, он поместится в регистры и будет работать с ними, иначе он начнет использовать память, сначала кеш, а затем просочиться в ОЗУ)
Вы можете поискать в Google «абстрактное синтаксическое дерево», чтобы получить представление о том, как читаемый код С++ преобразуется в машинный код.
вот почему важно узнать о константной корректности, псевдонимах и указателях по сравнению со ссылками, чтобы убедиться, что вы даете компилятору наилучшие шансы сгенерировать для вас оптимальный код. (помимо преимуществ, которые пользователь получает от этого)
person
Giel
schedule
13.08.2017