Передайте ссылку на местоположение вывода против использования возврата

Что лучше для производительности при вызове функции, которая предоставляет простой тип данных - если она заполняет ячейку памяти (передается указателем) или возвращает ей простые данные?

Я упростил пример, возвращающий статическое значение 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 в некоторых обстоятельствах или нет, встроенные вещи лучше в той или иной форме...

Используйте то, что имеет смысл в контексте.