![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Вопрос возник следующий, есть код:
1. Возник вопрос как передается MyObj в процедуру Foo - как указатель на объект или передается копия объекта через стек 2. если я напишу вот так - procedure Foo(const Obj: TMyObj); Obj.Property1 := 1; то компилятор ругаться не будет, почему? 3. какая разница между procedure Foo(var Obj: TMyObj); procedure Foo(const Obj: TMyObj); procedure Foo(Obj: TMyObj); Это сообщение отредактировал(а) Delphist - 31.7.2008, 08:40 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
ИМХО - передается указатель на объект.
поетому, компилятору все равно как ты передашь ети цифры. -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Delphi не умеет копировать объекты. Эта операция потенциально опасная, потому передача всегда будет по ссылке с той лишь разницей что при передаче объекта как var параметра, можно изменить значение той переменной что была передана в функцию, например занулить ее или записать в нее другой объект (напрмер наследника).
Добавлено через 44 секунды Кроме того объекты в Delphi в стеке не бывают -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Любой объект в Delphi - это указатель на блок памяти размером InstanceSize.
Поэтому SizeOf(MyObj) = SizeOf(TMyObj) = 4 <> TMyObj.InstanceSize. Размер любого объекта - минимум 4 байта (указатель на VMT), не считая сам указатель. Т.е. объект с одним полем типа Integer будет занимать блок памяти 8 байт (4 поле + 4 на VMT) плюс указатель на него - 4 байта, итого - 12 байт. Поэтому: procedure Foo(Obj: TMyObj); Сюда Obj передаётся по значению (как и написано в заголовке процедуры согласно общим принципам языка). Однако, поскольку Obj сам является указателем, то фактически в процедуру передаётся по значению четырёхбайтный указатель. Отсюда видна вся дальнейшая логика. Что из этого следует? Во первых:
Легко понять, почему при указании const компилятор даёт присваивать свойства объекта: const относится только к ссылке на блок памяти, но не к самому блоку памяти объекта. Кстати, слова "указатель на объект" можно понимать двояко. Во-первых, это может быть в точности ^TMyObj, т.е. фактически "указатель на указатель". Во-вторых, это может быть просто TMyObj, в этом случае под "объектом" просто понимается не блок памяти + указатель, а просто блок памяти. И ещё по соглашению const и var: часто они идентичны - т.е. данные передаются в процедуру по ссылке. Только для случая const компиятор не даёт их изменять, а для var - разрешает. Однако есть отличия для случая, когда данные имеют размер 4 байта и меньше. В этом случае нет смысла передавать их по ссылке (сама ссылка занимает места больше чем данные), поэтому в этом случае const данные передаются по значению. var-данные, разумеется, в этом случае передаются по ссылке - иначе их нельзя было бы модифицировать. Добавлено через 1 минуту и 57 секунд Уточню Смотря что понимать под объектом. Если собственно данные объекта - то да, никогда не бывают. Если же объект Delphi в строгом пониманиии этого слова (как указатель) - то очень часть они хранятся именно в стеке. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
А в С++ бывают как ни странно -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
В C++ еще и AV частенько появляются по неосторожности -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Эт к тому, что почему этого Borland не сделал для своего компилятора Это сообщение отредактировал(а) Delphist - 31.7.2008, 12:42 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Потому что это не нужно. Кроме того, как это не сделал? Сделал. Перекройте NewInstance/FreeInstance и размещайте объекты хоть в shared memory. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |