-
- Корректно полностью. RxTx(192 знак., 19.11.2020 14:46)
- Ага, причём новый тип определяется только ключевым словом 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)
- Абсолютно корректно. - LightElf(19.11.2020 14:44)
- Спасибо! А насколько большие структуры могут быть таким образом
скопированы? Любой длины? - my504(19.11.2020 14:48)
- Любые, но при этом будет получена побайтовая копия. Тупо байтики
перепишутся. - Boвa(19.11.2020 15:15)
- Ну вот совсем не факт. Для C++ совсем-совсем не факт (там
копирующий конструктор имеет право сделать что угодно), а для C
компилятор по крайней мере не обязан и может не копировать байтики
лежащие между полей (те, что обеспечивают выравнивание следующего
поля структуры). Понятно, что для длинных структур скорей будет
тупо вызван memcpy, но для коротких запросто может скопировать
поэлементно. fk0(121 знак., 19.11.2020 15:23)
- Вопрос был про структуры, а не про классы. У структур копия, а
конструктор копирования не предусмотрен. Boвa(59 знак., 19.11.2020 15:25 - 16:46)
- Это вы про какой язык? В C++ структуры от классов отличаются только тем, что их члены по дефолту public. - йцyкeн(19.11.2020 15:54)
- Вопрос был про структуры, а не про классы. У структур копия, а
конструктор копирования не предусмотрен. Boвa(59 знак., 19.11.2020 15:25 - 16:46)
- Ну вот совсем не факт. Для C++ совсем-совсем не факт (там
копирующий конструктор имеет право сделать что угодно), а для C
компилятор по крайней мере не обязан и может не копировать байтики
лежащие между полей (те, что обеспечивают выравнивание следующего
поля структуры). Понятно, что для длинных структур скорей будет
тупо вызван memcpy, но для коротких запросто может скопировать
поэлементно. fk0(121 знак., 19.11.2020 15:23)
- Всё равно там memcpy вставляется. Машина железная, не устанет. - SciFi(19.11.2020 15:06)
- Интересно почему так не прокатывает с массивами, которые уже
требуют memcpy? - my504(19.11.2020 15:20)
- Заверните массив в структуру, и будет щастя :-) - SciFi(19.11.2020 16:03)
- А в Паскале прокатывает :) - RxTx(19.11.2020 15:34)
- В вашем паскале нельзя printf() написать (или хотя бы свой
WriteLine). fk0(280 знак., 19.11.2020 15:50, ссылка)
- "В вашем паскале нельзя printf() написать" - Если очень приспичит, то нет ничего невозможного. :) ir0407(78 знак., 19.11.2020 17:50, ссылка)
- Паскаль лучше Езыка Ц как любая французская кинокомедия лучше её
американского римейка (а таковых мильон). - Kpoк(19.11.2020 17:43)
- Неужели в самом деле
все качелиLa totale лучше True Lies? - йцyкeн(21.11.2020 21:58) - Языки с begin и end вызывают у меня идиосинкразию. - Codavr(21.11.2020 21:28)
- Посмотри Высокого блондина ...с Томом Хэнксом, и сразу пройдёт. - Kpoк(22.11.2020 14:49)
- в Verilog`е меня эти begin/end подбешивают. но там все виды скобок
заняты - Mahagam(21.11.2020 21:31)
- Как можно занять все скобки? Всегда можно замутить что-нибудь.
Например, (-: smile smile :-). Или [:|| баян баян ||:]. - SciFi(21.11.2020 21:35)
- так и минус, и двоеточие, и вертикальная черта - всё используется.
дошло до того, что даже двойные фигурные скобки - отдельное
применение. Mahagam(70 знак., 22.11.2020 17:26)
- Двоеточие и в сях было занято, но это не помешало в плюсах
использовать двойное двоеточние. Короче, отговорка так себе. - SciFi(22.11.2020 17:45)
- Полагаю, что это концептуально. Кракозябры Си далеко не всем
нравятся. Как то простые словеса ближе к жизни и обиходу. Даже если
эти словеса английские. Помнится на приснопямятной Наири-2 язык
программирования (ЯАП) был на православном русском... ))) Набор
кода был практически предикативным. )))) - my504(22.11.2020 18:05)
- Там всё-таки армянский акцент был :-) - Kpoк(22.11.2020 18:53)
- "Наири - армянская машина для решения армянских задач", как говаривали в МИЭТе на кафедре ВМ :)) - MBedder(23.11.2020 00:01)
- Там всё-таки армянский акцент был :-) - Kpoк(22.11.2020 18:53)
- Полагаю, что это концептуально. Кракозябры Си далеко не всем
нравятся. Как то простые словеса ближе к жизни и обиходу. Даже если
эти словеса английские. Помнится на приснопямятной Наири-2 язык
программирования (ЯАП) был на православном русском... ))) Набор
кода был практически предикативным. )))) - my504(22.11.2020 18:05)
- Двоеточие и в сях было занято, но это не помешало в плюсах
использовать двойное двоеточние. Короче, отговорка так себе. - SciFi(22.11.2020 17:45)
- так и минус, и двоеточие, и вертикальная черта - всё используется.
дошло до того, что даже двойные фигурные скобки - отдельное
применение. Mahagam(70 знак., 22.11.2020 17:26)
- Как можно занять все скобки? Всегда можно замутить что-нибудь.
Например, (-: smile smile :-). Или [:|| баян баян ||:]. - SciFi(21.11.2020 21:35)
- Неужели в самом деле
- >>> RxTx(1 знак., 19.11.2020 17:33, картинка)
- В вашем паскале нельзя printf() написать (или хотя бы свой
WriteLine). fk0(280 знак., 19.11.2020 15:50, ссылка)
- В C/C++ вообще нет массивов как типа данных... Он всегда редуцируется до указателя на первый элемент. Массив, в частности, нельзя передать в качестве аргумента функции, нельзя вернуть из функции. fk0(551 знак., 19.11.2020 15:27)
- Интересно почему так не прокатывает с массивами, которые уже
требуют memcpy? - my504(19.11.2020 15:20)
- Любой - RxTx(19.11.2020 14:54)
- Еще раз спасибо!. - my504(19.11.2020 14:55)
- «Спасибо» в стакан не нальёшь, на хлеб не намажешь :))))) RxTx(4 знак., 19.11.2020 15:17)
- Еще раз спасибо!. - my504(19.11.2020 14:55)
- Любые, но при этом будет получена побайтовая копия. Тупо байтики
перепишутся. - Boвa(19.11.2020 15:15)
- Спасибо! А насколько большие структуры могут быть таким образом
скопированы? Любой длины? - my504(19.11.2020 14:48)
- Корректно полностью. RxTx(192 знак., 19.11.2020 14:46)