Я хотел знать, быстрее ли возвращать значение из функции или использовать указатель в качестве параметра и передать значение этому указателю.
В разных общих ABI, возврат по значению для больших объектов (не подстраиваемых в регистры) реализуется через указатель в любом случае. Вызывающий абонент резервирует пространство и передает указатель на вызываемого абонента, который использует этот указатель для создания объекта на месте.
struct
- это действительно скрытый memcpy
, не так ли?
struct
и класс - это одно и то же, и в большинстве случаев memcpy
не является правильным решением, и компилятор этого не сделает. в Itanium ABI достаточно большая struct
возвращается по значению посредством вызывающей стороны, передающей скрытый указатель, и вызываемой стороны, создающей struct
на месте; как уже говорилось в ответе.
С современными компиляторами и С++ 11 во многих случаях возвращение по значению быстрее всего: Want Speed? Перейдите по значению. (Архив)
Я предполагаю, что мы говорим о C++11
здесь, так как это было 2.x лет.
Начните с возврата объекта по значению: move semantics, (N) RVO может запускать и генерировать действительно быстрый код, который действительно легко читать. Однако, если вы просматриваете свой код и обнаруживаете, что эта конкретная функция является узким местом, подумайте о том, чтобы использовать ссылку как "параметр out". На самом деле это может быть быстрее, чем использование указателя, поскольку у компилятора больше гибкости, чем представление ссылки. Стандарт ISO для C++ не требует, чтобы ссылки требовали хранения, поэтому компилятор может свободно ссылаться на литеральный псевдоним другой ячейки памяти, эффективно используя нулевые байты служебных данных.
В общем, сначала напишите чистый код, а затем измерьте его. Люди недооценивают, насколько оптимизация может сделать компилятор для вас, если вы просто вернете свои (подвижные) объекты по значению.
return by value
случай return by value
, предположим, что у вызывающего есть объект для передачи, компилятор будет копировать копию этого аргумента, которая более или менее эквивалентна стоимости pass by reference
. Таким образом, с точки зрения производительности оба решения кажутся эквивалентными.
Указатель имеет длину 4 или 8 байтов в зависимости от архитектуры.
Если ваше значение меньше, чем размер, возможно, быстрее передать значения.
Если у вас большие объекты и конструкторы копирования, тогда будет скопировано больше памяти и передача таких параметров будет более дорогостоящей.
Но... оптимизация компилятора, выравнивание памяти и другое колдовство, может потребоваться, чтобы вы непосредственно исследовали это в ВАШЕМ случае.