Это быстрее, чтобы вернуть значение или использовать параметры указателя [дубликата]

0

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

  • 0
    Это может быть медленное количество, которое назначается отдельно, а также возвращаемое значение, но разница незначительна. Он станет больше на размер структуры в этом случае, как и возвращаемая структура.
  • 0
    Сначала вы должны рассмотреть, как много вы используете объект данных, возвращение указателя означает выделение в куче, а память кучи медленнее для начала. Поэтому возвращение указателя может быть быстрее в некоторых случаях, но если использовать эту структуру / объект, то медленнее, и вы часто его используете, ваша микрооптимизация была контрпродуктивной. Передача указателя на переменную стека в вызывающей функции, вероятно, быстрее ... но это обобщение, которое может быть неверным в вашем случае
Показать ещё 2 комментария
Теги:

5 ответов

4

В разных общих ABI, возврат по значению для больших объектов (не подстраиваемых в регистры) реализуется через указатель в любом случае. Вызывающий абонент резервирует пространство и передает указатель на вызываемого абонента, который использует этот указатель для создания объекта на месте.

  • 0
    Возвращение struct - это действительно скрытый memcpy , не так ли?
  • 0
    @FiddlingBits: это зависит от языка, в C, может быть (не эксперт C) в C ++, struct и класс - это одно и то же, и в большинстве случаев memcpy не является правильным решением, и компилятор этого не сделает. в Itanium ABI достаточно большая struct возвращается по значению посредством вызывающей стороны, передающей скрытый указатель, и вызываемой стороны, создающей struct на месте; как уже говорилось в ответе.
1

С современными компиляторами и С++ 11 во многих случаях возвращение по значению быстрее всего: Want Speed? Перейдите по значению. (Архив)

  • 0
    Там в разговор Чандлер Каррут , который идет в глубину , почему он быстрее передавать переменные по значению.
1

Я предполагаю, что мы говорим о C++11 здесь, так как это было 2.x лет.

Начните с возврата объекта по значению: move semantics, (N) RVO может запускать и генерировать действительно быстрый код, который действительно легко читать. Однако, если вы просматриваете свой код и обнаруживаете, что эта конкретная функция является узким местом, подумайте о том, чтобы использовать ссылку как "параметр out". На самом деле это может быть быстрее, чем использование указателя, поскольку у компилятора больше гибкости, чем представление ссылки. Стандарт ISO для C++ не требует, чтобы ссылки требовали хранения, поэтому компилятор может свободно ссылаться на литеральный псевдоним другой ячейки памяти, эффективно используя нулевые байты служебных данных.

В общем, сначала напишите чистый код, а затем измерьте его. Люди недооценивают, насколько оптимизация может сделать компилятор для вас, если вы просто вернете свои (подвижные) объекты по значению.

  • 0
    +1 за «сначала напишите самый чистый код, а затем измерьте его».
0

return by value случай return by value, предположим, что у вызывающего есть объект для передачи, компилятор будет копировать копию этого аргумента, которая более или менее эквивалентна стоимости pass by reference. Таким образом, с точки зрения производительности оба решения кажутся эквивалентными.

0

Указатель имеет длину 4 или 8 байтов в зависимости от архитектуры.

Если ваше значение меньше, чем размер, возможно, быстрее передать значения.

Если у вас большие объекты и конструкторы копирования, тогда будет скопировано больше памяти и передача таких параметров будет более дорогостоящей.

Но... оптимизация компилятора, выравнивание памяти и другое колдовство, может потребоваться, чтобы вы непосредственно исследовали это в ВАШЕМ случае.

  • 0
    Они не спрашивают о передаче ценностей. Они спрашивают, следует ли возвращать значения или передавать указатели в качестве параметров.
  • 0
    То же самое относится и к возвращаемым значениям.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню