fk0, легенда (19.11.2020 15:30, просмотров: 414) ответил RxTx на Корректно полностью.
Ага, причём новый тип определяется только ключевым словом struct (и
class в C++). А ключевое слово typedef на самом деле новый,
отличный от существующих, тип не определяет, а лишь создаёт алиас
для другого существующего (и в функцию принимающую алиас запросто
можно подсунуть как сам алиас, так и оригинальный тип). Кстати
возврат структур из функций (маленьких, с парой-тройкой элементов)
хороший способ перестать писать говнокод с возвратом результатов
через ссылки/указатели в аргументах.
[ZX]
-
- Речь идёт именно о возврате структуры или всё же указателя на неё? - 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, ссылка)
- Если хочется из функции вернуть указатель на структуру, для этой
структуры должна быть выделена память. Получается либо статическое
выделение (тогда нельзя вызовы из разных потоков, да и эта память
пустует 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)
- В читаемости, ИМХО. Компилер-то скорее всего, передаёт имана
указатель на структуру в куче. - 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)
- Очень ценный для меня совет со структурой-функцией. Спасибо. - my504(19.11.2020 15:47)