Оптимизация кода C++ с использованием выражений вместо переменных

У меня вопрос по созданию оптимальной программы на C++.

У меня есть функция, которая вычисляет такие выражения, как:

c= a/2
c = (a*b)/2
c = (a/2) + b

и т. д. лучше использовать переменную для хранения этих значений или просто использовать return <expression>?

Я понимаю, что создание переменной займет место, и return <expression> этого можно избежать. Но если это несколько возвратов, создает ли это больше накладных расходов, чем объявление переменной?


person weu833    schedule 27.08.2016    source источник
comment
Вы можете проверить ассемблерный код, сгенерированный в обоих случаях.   -  person sjsam    schedule 27.08.2016
comment
Не беда, оптимизирующий компилятор всё это увидит и скомпилирует в тот же код.   -  person Peter G.    schedule 27.08.2016
comment
Посмотрите фразу устранение общего подвыражения.   -  person Cody Gray    schedule 27.08.2016
comment
@CodyGray: или посмотрите точную копию, которую я нашел. Я не читал ответы, чтобы узнать, хороши ли они, и я уверен, что видел другие вопросы об использовании временных элементов или нет, которые получили хорошие ответы. В любом случае, не хочешь применить молоток-обманку? У меня все еще 50 голосов от золотого значка C++:/   -  person Peter Cordes    schedule 28.08.2016


Ответы (3)


Это типичный случай бесполезной микрооптимизации. Компилятор, скорее всего, все равно оптимизирует переменную.

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

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

person Frank Puffer    schedule 27.08.2016
comment
Это очень хороший аргумент! - person Jason C; 27.08.2016
comment
@JasonC: Как вы думаете, насколько оно более выразительно, чем имя функции? Вопрос заключается в том, чтобы присвоить переменную, а затем напрямую вернуть ее. - person Frank Puffer; 27.08.2016
comment
Я имел в виду, что в качестве поддерживающего комплимента это очень хороший ответ. Var name против fn name, это не одно и не другое. Сделайте оба. Выразительные имена функций и выразительные имена переменных. Например, возможно, та переменная, которую вы возвращаете, используется во всем теле функции до того, как она будет возвращена. Приятно знать, что это значит! И имена переменных вообще. - person Jason C; 27.08.2016

Это не имеет никакого значения.

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

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

person Jason C    schedule 27.08.2016

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

person blint587    schedule 27.08.2016