MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Передача по ссылке с последующим копированием vs передача по значению"
Answer 760563
передача по ссылке даёт более короткий ассемблерный код
В ассемблерном коде x86-64 clang, на который вы дали ссылку, разница между первым и вторым вариантом в следующем:
В первом варианте срабатывает оптимизация и структура копируется из переданного аргументом адреса сразу на место возвращаемого значения. При возврате не требуется дополнительных действий.
Во втором варианте такая оптимизация не применяется, и копирование структуры происходит два раза. Первый раз вызывающий код создает копию для передачи в функцию (за скобками данного кода), а второй раз - при возврате из функции.
Второй вариант длиннее на одну строку из-за оператора
lea rsi, [rsp + 16]
, который как раз и вычисляет аргумент source для вызова memcpy (в первом случае это не нужно, так как он явно передан вызывающей функцией). Таким образом, сферически в вакууме, второй вариант не эффективен, из-за двойного копирования структуры и лишнего вычисления аргумента для memcpy.какие есть ещё плюсы и минусы этих двух подходов, чтобы понимать, какой из них предпочесть?
Я полагаю, в реальных программах об этом не надо заботиться. Оптимизирующий компилятор будет рассматривать не отдельные функции, а программу в целом, и выберет лучший вариант. Хотя второй вариант теоретически "хуже", в реальности компилятор обе функции просто превратит в inline (если на них не берутся указатели), и разницы никакой не будет.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.