Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2015, 09:30   #1
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию Почему в языкастых книгах не рассмотрена такая возможность?

Есть передача параметра по значению и по указателю. С передачей по указателю всё ясно: где бы ни валялась сама переменная, её можно изменить. Передача по значению в том виде, как это реализовано в действительности, не позволяет вызываемому коду менять значение самой переменной, так как вызываемый код получает лишь копию переменной, или константы, и не "знает", где она валяется. Но почему не рассмотреть третью возможность? Можно ведь передать по значению, потом вызываемый код с полученной копией что то сделает, а потом можно эту копию скопировать назад, что приведёт к изменению самой переменной. Реализовывать этот способ передачи изменяемых параметров не следует. Но он ведь возможен, так как вызывающий код "знает", откуда он копировал параметр. Почему же в книгах его обходят полным молчанием? Например, у Шилдта, в "базовом курсе с++" прямо сказано, что способов передачи параметра два: по значению и по неявному указателю. Почему то забыто даже то, что из текста предшествующих глав той же книги ясно, что можно передать и по явному указателю. А передача по значению с обратным копированием даже не упомянута. Я понимаю, что чем гонять изменяемый параметр через стек да ещё в обе стороны, проще и эффективней передать адрес и менять значения прямо по месту. Но ведь можно же. Почему же эта возможность не рассмотрена даже в обзорном абзаце со словом "может"?

Последний раз редактировалось taras-proger; 18.09.2015 в 09:48.
taras-proger вне форума Ответить с цитированием
Старый 18.09.2015, 09:41   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
Можно ведь передать по значению, потом вызываемый код с полученной копией что то сделает, а потом можно эту копию скопировать назад, что приведёт к изменению самой переменной.
Вы про передачу по ссылке или про a = func(a)?
p51x вне форума Ответить с цитированием
Старый 18.09.2015, 09:42   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

procedure X(var y);
Забудьте уже о ссылках и указателях. Весь цивилизованный мир постепенно переходит на более высокоуровневые механизмы.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 18.09.2015 в 09:46.
Utkin вне форума Ответить с цитированием
Старый 18.09.2015, 09:48   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от taras-proger Посмотреть сообщение
Есть передача параметра по значению и по указателю. С передачей по указателю всё ясно: где бы ни валялась сама переменная, её можно изменить. Передача по значению в том виде, как это реализовано в действительности, не позволяет вызываемому коду менять значение самой переменной, так как вызываемый код получает лишь копию переменной, или константы, и не "знает", где она валяется. Но почему не рассмотреть третью возможность? Можно ведь передать по значению, потом вызываемый код с полученной копией что то сделает, а потом можно эту копию скопировать назад, что приведёт к изменению самой переменной. Реализовывать этот способ передачи изменяемых параметров не следует. Но он ведь возможен, так как вызывающий код "знает", откуда он копировал параметр. Почему же в книгах его обходят полным молчанием? Например, у Страуструпа, в "базовом курсе с++" прямо сказано, что способов передачи параметра два: по значению и по неявному указателю. Почему то забыто даже то, что из текста предшествующих глав той же книги ясно, что можно передать и по явному указателю. А передача по значению с обратным копированием даже не упомянута. Я понимаю, что чем гонять изменяемый параметр через стек да ещё в обе стороны, проще и эффективней передать адрес и менять значения прямо по месту. Но ведь можно же. Почем же эта возможность не рассмотрена даже в обзорном абзаце?
Таакк.У тебя - депрессия. Попей водочки. Ну, морду кому нибудь набей (или теде набьют) Как получится.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 18.09.2015, 09:58   #5
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вы про передачу по ссылке или про a = func(a)?
Нет. Речь о передаче по значению но с обратным копированием, фрагменте исходника, компилируемом из
Код:
swap (x,y);
в
Код:
MOV EBX, [DWORD PTR]@x
MOV ECX, [DWORD PTR]@y
PUSH EBX
PUSH ECX
CALL SWAP
POP ECX
POP EBX
MOV [DWORD PTR]@y, ECX
MOV [DWORD PTR]@x, EBX
. Обратите внимание: здесь за извлечение изменённых параметров из стека и копирование их в переменные отвечает вызывающий код, но это именно параметры, а не значение функции.
Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Таакк.У тебя - депрессия. Попей водочки. Ну, морду кому нибудь набей (или теде набьют) Как получится.
А вот свои болячки другим не красиво приписывать. Кстати, я уже исправил "Страуструпа" на "Шилдта". И не берите пример с Ольги Лосоноговой.

Последний раз редактировалось taras-proger; 18.09.2015 в 10:11.
taras-proger вне форума Ответить с цитированием
Старый 18.09.2015, 10:30   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

так swap это исключение же.(да и странный асм код вышел, это какой компилятор?)

а смысл в этом не вижу, ибо итог сего действа равен копированию по ссылке, но нагрузки больше.


---------Добавлено
хотя судя по всему это cdecl, с учетом знания компилятора о типах данных, и вместо ссылок он решил применить это.
но смысл все равно в том что это аналогично копированию по ссылке, просто оптимизация для короткого типа.
--------Добавлено
+ swap шаблонная.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 18.09.2015 в 10:55.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.09.2015, 11:00   #7
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
да и странный асм код вышел,
Просто он соответствует странному способу передачи изменяемого параметра.
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
это какой компилятор?)
Это вообще-то вручную написано, такого компилятора нет и при вменяемых программистах-инструментальщиках не будет. Вопрос в том, почему в языкастых книгах для новичков не рассказано, что это в принципе возможно, но так делать не надо и почему именно так делать не надо.
taras-proger вне форума Ответить с цитированием
Старый 18.09.2015, 11:00   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
procedure X(var y);
Забудьте уже о ссылках и указателях. Весь цивилизованный мир постепенно переходит на более высокоуровневые механизмы.
это про какие механизмы речь идет, если не секрет?



....
не пониманию как из приведенного асм кода может следовать столько волнительного обсуждения. код какой-то бредовый. что делает swap(x, y) неизвестно, по виду понятно только, что swap удовлетворяет соглашению вызова cdecl (вызывающий чистит стек), что тут еще обсуждать непонятно.

Цитата:
Речь о передаче по значению но с обратным копированием
если такая фигня существует, то она должна иметь свой высокоуровневый синтаксис, а из кода который нагенерил компилятор, только следует, что кому-то стоит продолжить работы над полировкой компилятора.

кстати, тс, возьми свой swap(x, y) и откомпилируй разными компиляторами, или одним с разными настройками, а потом расскажи про какие еще методы передачи параметров не пишут в "языкастых книгах".

Последний раз редактировалось f.hump; 18.09.2015 в 11:56.
f.hump вне форума Ответить с цитированием
Старый 18.09.2015, 11:12   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

Цитата:
Сообщение от taras-proger Посмотреть сообщение
Можно ведь передать по значению, потом вызываемый код с полученной копией что то сделает, а потом можно эту копию скопировать назад
Для этого существуют ссылки (reference), а то, что вы описываете, это детали имплементации. На уровне языка переменная либо изменится, либо нет, как компилятор этого добъется вам не должно быть дела.

Ваш метод страдает одним изъяном - если передавать такой параметр много раз, то каждый раз надо будет данные копировать а данные могут быть сложным классом, который копируется медленно.
waleri вне форума Ответить с цитированием
Старый 18.09.2015, 11:15   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Вопрос в том, почему в языкастых книгах для новичков не рассказано, что это в принципе возможно, но так делать не надо и почему именно так делать не надо.
Ну у Шилдта спросить - почему он, негодяй, не упомянул такой способ. Можно и другие придумать и опять у него спросить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли такая возможность подключить больше одно 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