-
- Ага, причём новый тип определяется только ключевым словом struct (и
class в C++). А ключевое слово typedef на самом деле новый,
отличный от существующих, тип не определяет, а лишь создаёт алиас
для другого существующего (и в функцию принимающую алиас запросто
можно подсунуть как сам алиас, так и оригинальный тип). Кстати
возврат структур из функций (маленьких, с парой-тройкой элементов)
хороший способ перестать писать говнокод с возвратом результатов
через ссылки/указатели в fk0(11 знак., 19.11.2020 15:30)
- Речь идёт именно о возврате структуры или всё же указателя на неё? - teap0t(19.11.2020 21:38)
- Именно о возврате структуры. - SciFi(19.11.2020 21:39)
- А можно о преимуществе на пальцах для малограмотных? Я просто в
ходе разбора со своими делами плавно переполз на структуры, чтобы
не путаться в аргументах. Но ссылка - это одно слово в стеке, а
структура будет заведомо больше (в том же стеке). И нафига козе
баян? - teap0t(19.11.2020 21:43)
- Разницы нет вообще. Ссылка ссылается на некую структуру в стеке, или структура возвращается по значению и хранится в том же стеке! С учётом того, что современные компиляторы массово делают RVO (см. google), то разница совсем нивелируется. Разница начинает проявляться только если RVO невозможно и если структура очень большая. - fk0(19.11.2020 23:26)
- Если нужно вернуть 2 числа. Частное и остаток, например. А слова в
стеке считать — порочная практика. Можете сразу возвращаться к
ассемблеру. Со словами в стеке всё будет хорошо, но программу не
напишете. - SciFi(19.11.2020 21:46)
- Классика жанра -- man div(3). - fk0(19.11.2020 23:27)
- Ну, прекратите. Хер с ним, со стеком. Чем ссылка (это
подчёркивается в исходной реплике) хуже самой структуры. Я не
придуриваюсь, я не понимаю. Ну вплоть до того, что обращение к
элементам структуры по ссылке идёт через "->", а без неё по
".". Мне второе нравится меньше (труднее воспринимать). - teap0t(19.11.2020 21:54)
- В варианте со ссылкой, верней с указателем если в голом 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, ссылка)
- А можно о преимуществе на пальцах для малограмотных? Я просто в
ходе разбора со своими делами плавно переполз на структуры, чтобы
не путаться в аргументах. Но ссылка - это одно слово в стеке, а
структура будет заведомо больше (в том же стеке). И нафига козе
баян? - teap0t(19.11.2020 21:43)
- Именно о возврате структуры. - SciFi(19.11.2020 21:39)
- Очень ценный для меня совет со структурой-функцией. Спасибо. - my504(19.11.2020 15:47)
- Это работает RVO (Return Value Optimization) и NRVO (Named Return Value Optimization) - evgeniy1294(19.11.2020 15:56)
- Речь идёт именно о возврате структуры или всё же указателя на неё? - teap0t(19.11.2020 21:38)
- Ага, причём новый тип определяется только ключевым словом struct (и
class в C++). А ключевое слово typedef на самом деле новый,
отличный от существующих, тип не определяет, а лишь создаёт алиас
для другого существующего (и в функцию принимающую алиас запросто
можно подсунуть как сам алиас, так и оригинальный тип). Кстати
возврат структур из функций (маленьких, с парой-тройкой элементов)
хороший способ перестать писать говнокод с возвратом результатов
через ссылки/указатели в fk0(11 знак., 19.11.2020 15:30)