Передайте ссылку на местоположение вывода против использования возврата
Что лучше для производительности при вызове функции, которая предоставляет простой тип данных - если она заполняет ячейку памяти (передается указателем) или возвращает ей простые данные?
Я упростил пример, возвращающий статическое значение 5 здесь, но предположим, что поиск/функциональность, определяющая возвращаемое значение, будет динамичной в реальной жизни...
Обычная логика подскажет мне, что первый подход выполняется быстрее, поскольку мы работаем по ссылке вместо того, чтобы возвращать копию, как во втором подходе... Но я бы хотел, чтобы мнения других людей.
Спасибо
void func(int *a) {
*a = 5;
}
или...
int func() {
return 5;
}
Ответы
Ответ 1
В общем случае, если ваша функция действует как функция (то есть возвращает одно логическое значение), то, вероятно, лучше всего использовать int func()
. Даже если возвращаемое значение является сложным объектом С++, существует общая оптимизация, называемая Оптимизация возвращаемого значения, которая позволяет избежать ненужного копирования объектов и делает эти две формы примерно эквивалентными во время выполнения.
Ответ 2
Большинство компиляторов вернут значение в регистре, пока возвращаемое вами число достаточно мало, чтобы вписаться в регистр. Это довольно необычно (и часто почти невозможно) для чего-то еще более эффективного.
Ответ 3
Для POD нет никакой или почти никакой разницы, и я всегда буду иметь возвращаемое значение, поскольку я нахожу их более чистыми и более легкими для чтения.
Для не-POD ответ "зависит" - многие компиляторы используют Оптимизацию возвращаемого значения в этом сценарии, который стремится создать неявный ссылочный параметр.
Однако, если вы не измерили - не "знаете", а фактически измеряли с помощью профилировщика, - что возврат результатов функции с использованием возвращаемого значения на самом деле является узким местом в вашем программном обеспечении, перейдите к более читаемой версии кода.
Ответ 4
По-моему, всегда ходите с return
, если вы не знаете причину не для этого, или вам нужно вернуть более одного значения из функции. Возврат встроенного типа очень эффективен, и независимо от того, какая разница или возврат с помощью указателя, он должен быть незначительным. Но реальная выгода от использования return
более ясна и проста для тех, кто читает код позже.
Ответ 5
Возвращение простого значения - это всего лишь что-то вроде instrution в assmbly (т.е. MOV eax, xxxx), передавая параметр, вводят немного больше накладных расходов. в любом случае вы не должны беспокоиться об этом, разница трудно заметить.
Другая важная проблема заключается в том, что функция returniong слева, как правило, более чистая с точки зрения дизайна и предпочтительнее, когда это возможно.
Ответ 6
Это вещь низкого уровня, где было бы трудно увидеть какую-либо разницу.
Ответ 7
Простой ответ: это зависит.
Это зависит от используемых типов, могут ли они быть скопированы дешево или нет (или вообще), может ли компилятор использовать RVO в некоторых обстоятельствах или нет, встроенные вещи лучше в той или иной форме...
Используйте то, что имеет смысл в контексте.