Компилятор оптимизирует параметры функции, переданные значением?

Позволяет говорят, что у меня есть функция, куда параметр передается значением вместо ссылки константы. Далее, позволяет, предполагают, что только значение используется в функции, т.е. функция не пытается изменить его. В этом случае будет компилятор мочь выяснить, что он может передать значение ссылкой константы (по причинам производительности) и сгенерировать код соответственно? Есть ли какой-либо компилятор, который делает это?

19
задан Naveen 15 March 2010 в 15:57
поделиться

5 ответов

Если вы передаете переменную вместо временной, компилятору не разрешается оптимизировать копию, если ее конструктор копирования делает что-либо, что вы заметили бы при запуске программы («наблюдаемое поведение»: входы / выходы или изменение изменчивых переменных ).

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

Только когда аргумент является rvalue (наиболее временным), компилятору разрешается оптимизировать копию параметра по значению, даже если конструктор копирования имеет наблюдаемые побочные эффекты.

14
ответ дан 30 November 2019 в 04:44
поделиться

Этот пост является отличной ссылкой на этот вид оптимизации: http://cpp-next.com/archive/ 2009/08 / want-speed-pass-by-value /

-1
ответ дан 30 November 2019 в 04:44
поделиться

Только если функция не экспортируется, компилятор может преобразовать вызов по ссылке в вызов по значению (или наоборот).

В противном случае, из-за соглашения о вызовах, функция должна сохранять семантику вызова по значению / ссылке.

7
ответ дан 30 November 2019 в 04:44
поделиться

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

Играйте безопасно: пишите код так, как вы задумали - передавайте по ссылке, если это то, что вам нужно. Однако если вы пишете шаблонизированный код, который может работать с типами любого размера, выбор не так однозначен. Лично я бы выбрал передачу по const ссылке - компилятор может также выполнить другую оптимизацию, когда маленький тип, который может поместиться в размер ссылки, передается по значению, а не по const ссылке. Но опять же, это может произойти, а может и нет.

0
ответ дан 30 November 2019 в 04:44
поделиться

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

Возможно, вам стоит подумать о том, имеет ли класс этого значения параметра конструктор копирования или нет. Если нет, то разница в производительности между pass-by-value и pass-by-const-ref, вероятно, будет незначительной.

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

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

1
ответ дан 30 November 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: