Цель руководства по стилю кодирования - сказать вам, что если вы его читаете, вряд ли вы добавили оптимизацию в настоящий компилятор, еще менее вероятно, что добавили полезную оптимизацию (измеренную другими людьми на реалистичных программах в широком диапазоне). процессоров), поэтому вряд ли удастся угадать тех, кто это сделал. По крайней мере, не вводите их в заблуждение, например, помещая ключевое слово volatile перед всеми своими переменными.
Встраивание решений в компилятор имеет мало общего с «Делаем простой предсказатель переходов счастливым». Или менее запутанный.
Во-первых, целевой ЦП может даже не иметь предсказания ветвления.
Во-вторых, конкретный пример:
Представьте компилятор, у которого нет других оптимизаций (включенных), кроме встраивания. Тогда единственным положительным эффектом встраивания функции является то, что учет вызовов функций (сохранение регистров, настройка локальных переменных, сохранение адреса возврата и переходы к и обратно) устраняются. Стоимость заключается в дублировании кода в каждом месте, где вызывается функция.
В реальном компиляторе выполняются десятки других простых оптимизаций, и надежда на встраивание решений состоит в том, что эти оптимизации будут хорошо взаимодействовать (или каскадно). Вот очень простой пример:
int f(int s)
{
...;
switch (s) {
case 1: ...; break;
case 2: ...; break;
case 42: ...; return ...;
}
return ...;
}
void g(...)
{
int x=f(42);
...
}
Когда компилятор решает встроить f, он заменяет правую часть присваивания телом f. Он заменяет фактический параметр 42 на формальный параметр s и внезапно обнаруживает, что переключатель находится на постоянном значении ... поэтому он отбрасывает все другие ветви, и, надеюсь, известное значение позволит дальнейшие упрощения (т.е. они каскадируются).
Если вам действительно повезет, все вызовы функции будут встроенными (и если f не будет виден снаружи), исходный f полностью исчезнет из вашего кода. Таким образом, ваш компилятор устранил всю бухгалтерию и уменьшил размер кода во время компиляции. И сделал код более локальным во время выполнения.
Если вам не повезло, размер кода увеличивается, локальность во время выполнения уменьшается, а ваш код работает медленнее.
Сложнее привести хороший пример, когда полезны встроенные циклы, потому что нужно предполагать другие оптимизации и взаимодействия между ними.
Дело в том, что чертовски сложно предсказать, что произойдет с фрагментом кода, даже если вы знаете все способы, которыми компилятор может его изменить. Я не могу вспомнить, кто это сказал, но нельзя распознать исполняемый код, созданный оптимизирующим компилятором.
person
user1666959
schedule
25.03.2015
inline
. - person EOF   schedule 24.03.2015