ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
1053836 Топик полностью
fk0, легенда (19.11.2020 23:38, просмотров: 390) ответил teap0t на Ну, прекратите. Хер с ним, со стеком. Чем ссылка (это подчёркивается в исходной реплике) хуже самой структуры. Я не придуриваюсь, я не понимаю. Ну вплоть до того, что обращение к элементам структуры по ссылке идёт через "->", а без неё по ".". Мне второе нравится меньше (труднее воспринимать).
В варианте со ссылкой, верней с указателем если в голом C: 
struct S {...};

void f(struct S *s)
{
   s->a = 1, s->b = 2...
}

В варианте с возвратом по значению:


struct S f(void)
{
   return (struct S){ 1, 2... };
}

В первом случае память выделяется на стеке вызывающей функции. Во втором теоретически память выделяется и в вызывающей функции и в вызываемой. Потом в вызываемой формируется структура, копируется на вершину стека, происходит возврат из функции, структура копируется в выделенную память... Но это теоретически. Практически в ещё вызываемой функции всё пишется прямо в нужные ячейки стека и вызывающая функция прямо их использует потом. ВСЁ. Практическая часть начинает быть сложной только в очень нетривиальных случаях, когда и по значению возвращать совершенно не нужно.


Кроме того, если функция статическая (а любую функцию, если она не вызывается из других модулей НУЖНО ДЕЛАТЬ СТАТИЧЕСКОЙ, чтоб оптимизатор мог вообще нормально работать), оптимизация может пойти намного дальше и разницы думать как там что через какие регистры передаётся -- не стоит вообще. Компилятор в любом случае сделает лучше тебя, практически всегда. А преждевременная оптимизация может дать только багоопасный нечитаемый код.


Примеры:

Compiler Explorer

[ZX]