-
- В варианте со ссылкой, верней с указателем если в голом C: fk0(1185 знак., 19.11.2020 23:38, ссылка)
- Это от ABI/Calling convention зависит. Распространенная практика -
передается неявный указатель на структуру, куда функа и сложит
результат. - LightElf(20.11.2020 12:51)
- "A Composite Type larger than 4 bytes, or whose size cannot be determined statically by both caller and callee, is stored in memory at an address passed as an extra argument when the function was called (Parameter Passing, rule A.4). The memory to be used for the result may be modified at any point during the function call. " -- да. Но мне непонятно, почему в варианте с циклом он занимается копированием. Мог бы сразу положить куда нужно. Так возврат структур (как в abi fk0(27 знак., 20.11.2020 13:09)
- Это от ABI/Calling convention зависит. Распространенная практика -
передается неявный указатель на структуру, куда функа и сложит
результат. - LightElf(20.11.2020 12:51)
- Если хочется из функции вернуть указатель на структуру, для этой структуры должна быть выделена память. Получается либо статическое выделение (тогда нельзя вызовы из разных потоков, да и эта память пустует 99% времени), либо выделено заранее перед вызовом функции (тот ещё геморрой). - SciFi(19.11.2020 22:02)
- Делаете return struct вместо танца с указателями. А как компилятор
с этим будет изъ@бываться, не ваша забота. Он умный, у него
инсталяха он скока гигов. - mse homjak(19.11.2020 21:59)
- Как возвращать структуру мне понятно (типа, объявить тип
возвращаемого значения и задействовать "return"). Но в чём
преимущество такого стиля перед указателем на структуру? - teap0t(19.11.2020 22:10)
- Чтобы вернуть указатель на что-то, это что-то нужно сначала
определить. А когда возвращаешь структуру, всё делается
автоматически. Вопрос не эффективности кода, а эффективности
программирования. - Nikolay_Po(19.11.2020 22:15)
- Я чего-то явно не понимаю. Мы же структуру возвращаем куда-то, т.е.
в переменную имеющую такой же тип. Она уже определена и занимает
память. Мы не можем обращаться к полям структуры через x = my_func(..).field_1; - teap0t(19.11.2020 22:23)
- Мы структуру возвращаем во временный объект. Но опять же следует разделить, то что как бы понарошку, и что получается на самом деле. Этот временный объект -- он существует только в голове у тебя, компилятор там как-то аллоцирует регистры и куда-то положит лучше тебя, не твоя забота. И этот временный объект живёт до точки с запятой (';'), потом уничтожается. fk0(1233 знак., 20.11.2020 00:00, ссылка)
- Верно, всё равно переменная будет. Получается, возврат структуры
немного нагляднее. Там даже слово return используется. А если из
возвращаемой структуры используется только одно поле, то
func().field можно и нужно использовать. - SciFi(19.11.2020 22:30)
- Опа! Учту. - teap0t(19.11.2020 23:18)
- Я чего-то явно не понимаю. Мы же структуру возвращаем куда-то, т.е.
в переменную имеющую такой же тип. Она уже определена и занимает
память. Мы не можем обращаться к полям структуры через x = my_func(..).field_1; - teap0t(19.11.2020 22:23)
- В читаемости, ИМХО. Компилер-то скорее всего, передаёт имана
указатель на структуру в куче. - mse homjak(19.11.2020 22:14)
- Когда я заглядывал, там через стек было. - SciFi(19.11.2020 22:28)
- Т.е. вариант teap0t(229 знак., 19.11.2020 22:20)
- НЕТ. Первый вариант лучше, но не потому что эффетивней. Он лишь не хуже в простых случаях. Он лучше по другим причинам, может быть значимым для языка C, но значимым для C++ (требуется конструктор по-умолчанию, нужен placement new...), и это не про эффективность ассемблера вообще. Кроме того он наглядней и менее подвержен ошибкам. Для вариантов с большими структурами, с циклами, с объявлением struct_A не здесь и сейчас, а где-то в другом месте, и вообще не в стеке -- второй fk0(89 знак., 20.11.2020 00:06)
- Ну, ИМХО, тут дело не в объявлении, а в последующем использовании.
Например, в одном режиме вам нужно получить от функцыи комплект
настроек и сразу упихать его в порты. А в другом режиме нужно
набить массив из этих структур, чтобы, например, потом, по таймеру,
метать их в топку. Работать со структурой будет удобнее и
нагляднее, чем с указателями. - mse homjak(19.11.2020 22:33)
- Ок. - teap0t(19.11.2020 23:19)
- Чтобы вернуть указатель на что-то, это что-то нужно сначала
определить. А когда возвращаешь структуру, всё делается
автоматически. Вопрос не эффективности кода, а эффективности
программирования. - Nikolay_Po(19.11.2020 22:15)
- Как возвращать структуру мне понятно (типа, объявить тип
возвращаемого значения и задействовать "return"). Но в чём
преимущество такого стиля перед указателем на структуру? - teap0t(19.11.2020 22:10)
- В варианте со ссылкой, верней с указателем если в голом C: fk0(1185 знак., 19.11.2020 23:38, ссылка)