![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Подтвердите свой е-майл
Регистрация: 12.11.2014
Сообщений: 470
|
![]()
Есть передача параметра по значению и по указателю. С передачей по указателю всё ясно: где бы ни валялась сама переменная, её можно изменить. Передача по значению в том виде, как это реализовано в действительности, не позволяет вызываемому коду менять значение самой переменной, так как вызываемый код получает лишь копию переменной, или константы, и не "знает", где она валяется. Но почему не рассмотреть третью возможность? Можно ведь передать по значению, потом вызываемый код с полученной копией что то сделает, а потом можно эту копию скопировать назад, что приведёт к изменению самой переменной. Реализовывать этот способ передачи изменяемых параметров не следует. Но он ведь возможен, так как вызывающий код "знает", откуда он копировал параметр. Почему же в книгах его обходят полным молчанием? Например, у Шилдта, в "базовом курсе с++" прямо сказано, что способов передачи параметра два: по значению и по неявному указателю. Почему то забыто даже то, что из текста предшествующих глав той же книги ясно, что можно передать и по явному указателю. А передача по значению с обратным копированием даже не упомянута. Я понимаю, что чем гонять изменяемый параметр через стек да ещё в обе стороны, проще и эффективней передать адрес и менять значения прямо по месту. Но ведь можно же. Почему же эта возможность не рассмотрена даже в обзорном абзаце со словом "может"?
Последний раз редактировалось taras-proger; 18.09.2015 в 09:48. |
![]() |
![]() |
![]() |
#2 | |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,830
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
procedure X(var y);
Забудьте уже о ссылках и указателях. Весь цивилизованный мир постепенно переходит на более высокоуровневые механизмы.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() Последний раз редактировалось Utkin; 18.09.2015 в 09:46. |
![]() |
![]() |
![]() |
#4 | |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
![]() Цитата:
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder |
|
![]() |
![]() |
![]() |
#5 |
Подтвердите свой е-майл
Регистрация: 12.11.2014
Сообщений: 470
|
![]()
Нет. Речь о передаче по значению но с обратным копированием, фрагменте исходника, компилируемом из
Код:
Код:
Последний раз редактировалось taras-proger; 18.09.2015 в 10:11. |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
так swap это исключение же.(да и странный асм код вышел, это какой компилятор?)
а смысл в этом не вижу, ибо итог сего действа равен копированию по ссылке, но нагрузки больше. ---------Добавлено хотя судя по всему это cdecl, с учетом знания компилятора о типах данных, и вместо ссылок он решил применить это. но смысл все равно в том что это аналогично копированию по ссылке, просто оптимизация для короткого типа. --------Добавлено + swap шаблонная. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 18.09.2015 в 10:55. |
![]() |
![]() |
![]() |
#7 |
Подтвердите свой е-майл
Регистрация: 12.11.2014
Сообщений: 470
|
![]()
Просто он соответствует странному способу передачи изменяемого параметра. Это вообще-то вручную написано, такого компилятора нет и при вменяемых программистах-инструментальщиках не будет. Вопрос в том, почему в языкастых книгах для новичков не рассказано, что это в принципе возможно, но так делать не надо и почему именно так делать не надо.
|
![]() |
![]() |
![]() |
#8 | ||
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]() Цитата:
.... не пониманию как из приведенного асм кода может следовать столько волнительного обсуждения. код какой-то бредовый. что делает swap(x, y) неизвестно, по виду понятно только, что swap удовлетворяет соглашению вызова cdecl (вызывающий чистит стек), что тут еще обсуждать непонятно. Цитата:
кстати, тс, возьми свой swap(x, y) и откомпилируй разными компиляторами, или одним с разными настройками, а потом расскажи про какие еще методы передачи параметров не пишут в "языкастых книгах". Последний раз редактировалось f.hump; 18.09.2015 в 11:56. |
||
![]() |
![]() |
![]() |
#9 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,372
|
![]() Цитата:
Ваш метод страдает одним изъяном - если передавать такой параметр много раз, то каждый раз надо будет данные копировать а данные могут быть сложным классом, который копируется медленно. |
|
![]() |
![]() |
![]() |
#10 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]() Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Есть ли такая возможность подключить больше одно HDD-SATA к BeagleBone/CubieTruck | pompiduskus | Компьютерное железо | 0 | 04.10.2014 17:49 |
О книгах | Halifath | Помощь студентам | 3 | 11.02.2010 08:00 |
DBGrid есть ли такая возможность | Baharev | БД в Delphi | 10 | 28.11.2009 20:17 |
Почему такая разница между Integer и LongInt? | k1r1ch | Общие вопросы Delphi | 13 | 13.10.2009 09:01 |
почему такая бяка??? | Sjava | Свободное общение | 17 | 13.11.2006 08:37 |