Может ли компилятор оптимизировать ссылку на постоянный параметр на постоянное значение? - PullRequest
2 голосов
/ 13 октября 2010

Рассмотрим следующую функцию:

void func(const char & input){
 //do something
}

Очевидно, что параметр имеет постоянное значение, а не ссылка на константу относительно размера типа char, теперь может компилятор оптимизировать это до константы значение, чтобы оно совпадало со следующим?

void func(const char input){
 //do something
}

Ответы [ 3 ]

5 голосов
/ 13 октября 2010

Нет.Это не эквивалентно.В первом случае входные данные все еще могут изменяться, например, если это ссылка на переменную, измененную другим потоком.

2 голосов
/ 13 октября 2010

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

Это саморасширяющееся, что если ваша функция пишет в ссылку, и глобальная переменная была передана в качестве аргумента функции, а глобальная была позже напечатана после того, как функция вернулась, или что-то еще было сделано, то если компилятор измените соглашение о передаче параметров, компилятору будет сложнее доказать, что вы по-прежнему наблюдаете то же самое поведение. Если компилятор не может доказать это, он не может выполнить желаемую оптимизацию.

Так что, какой бы ни был следующий вопрос, просто подумайте: «Он может делать что угодно, пока я этого не замечу».

1 голос
/ 13 октября 2010

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

...