Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
Delphi 6-7

Теоретический пробел в TObject.Create

01.09.2023, 13:00. Показов 7152. Ответов 180
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!

Возник у меня некий теоретический пробел по поводу конструктора TObject.Create.

C одной стороны, он ведет себя, как функция, возвращающая указатель на созданный экземпляр.
С другой стороны, сам Delphi считает его процедурой.
В хелпе указано, что TObject.Create выделяет память, но не инициализирует данные. Но память выделяет.
А в исходниках все тело конструктора состоит из begin/end.

Правильно ли я понимаю, что этот конструктор - что-то типа разновидности команды для препроцессора, где компилятор Delphi, встречая этот вызов, сам организовывает выделение памяти и возвращение адреса созданного экземпляра?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.09.2023, 13:00
Ответы с готовыми решениями:

Cannot convert 'void (_fastcall * (_closure )(TObject *,char &))(TObject *,char &)' to 'TKeyPressEvent'
доброго времени суток. роект был создан в builder 2007, а при попытке его скомпилировать на rad studio 2010 выдается ошибка: ...

Reverse for 'create' not found. 'create' is not a valid view function or pattern name
Всем привет, появилась проблема. Всё делал по инструкции, по итогу всё равно выбило ошибку: NoReverseMatch at / Reverse for 'create'...

TFilestream.create [cannot create file]
function bat: string; begin with TFileStream.Create(extractfilepath(application.ExeName)+'bin\gcc\bin\compile.bat', fmCreate) do ...

180
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
02.09.2023, 14:57
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Constcat Посмотреть сообщение
Смотришь в исходники - а там пустое тело.
Цитата Сообщение от Constcat Посмотреть сообщение
программиста различные Compiler Maigic должны раздражать и побуждать на исследование
Ну тебя же не раздражает, что при вызове процедур/функций/методов скрыто производятся различные действия по подготовке вызовов? Или не напрягает что там под капотом работы со строками? Да то же выделение памяти под локальные переменные тоже скрыто происходит. Почему, тогда, раздражает неявное выделение памяти в TObject?
1
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
02.09.2023, 17:10  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Обсуждение ситуации её не изменит.
Обсуждение ситуации добавляет понимание и уменьшение количества compiler magic и пр. черных ящиков.
Цитата Сообщение от Verevkin Посмотреть сообщение
Иди лучше пивка выпей и успокойся.
Сам свое пиво мерзсзсзсзкое пей!

Добавлено через 9 минут
Цитата Сообщение от AzAtom Посмотреть сообщение
Ну тебя же не раздражает, что при вызове процедур/функций/методов скрыто производятся различные действия по подготовке вызовов? Или не напрягает что там под капотом работы со строками? Да то же выделение памяти под локальные переменные тоже скрыто происходит. Почему, тогда, раздражает неявное выделение памяти в TObject?
Потому подготовка стека и пр. телодвижения - общие для вызова процедур и функций. Они не являются заявленным функционалом Delphi, а изначально относятся к работе компилятора.
То же самое касается и реализации работы со строками.
Но когда есть определение процедуры, есть определение функции (в рамках языка), но некая конструкция, считающаяся "процедурой" (по определению) ведет себя как функция (по факту), при этом имея пустое тело, это вызывает вопросы.
В модуле System много ассемблерного текста, и это понятно, но это то, на что можно посмотреть (если уж есть желание). Так что это - не compiler magic, а особенности реализации.

А вот Create посмотреть так и не удалось))) Пустое тело, даже ассемблер не показали.))) А может я хочу свой аллокатор памяти там использовать, может мне делфийский не устраивает?)))

Добавлено через 12 минут
Цитата Сообщение от Пытливый Посмотреть сообщение
то дело в том, что введение классов в язык добавило и еще один вид функции - constructor, который всегда возвращает только один тип результата - ссылку на созданный экземпляр класса и потому нет необходимости явно указывать возвращаемый результат такой функции.
Кстати, конструктор был до классов. Он нормально существовал еще для object и занимался вполне конкретными вещами - инциализацией VMT. И вызывать его можно было прямо из уже готового экземпляра.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
02.09.2023, 17:44
Цитата Сообщение от Constcat Посмотреть сообщение
А может я хочу свой аллокатор памяти там использовать, может мне делфийский не устраивает?)))
А реализация методов потом как будет работать с этим неизвестным аллокатором?

Цитата Сообщение от Constcat Посмотреть сообщение
Так что это - не compiler magic, а особенности реализации.
Моя не согласен. Есть много штук, которые ссылаются на System.pas, на строку 18 (в Delphi 7) - это значит, что их реализация спрятана в компиляторе и её просто так не посмотреть. Принципиально выделение памяти Create от этого не отличается.

Он ещё и для всех полей всех потомков выделяет память. Тоже интересно.
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
02.09.2023, 17:54  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
А реализация методов потом как будет работать с этим неизвестным аллокатором?
Это уже будет головной болью для программиста, который хочет использовать свой аллокатор.
Но это я так, придираюсь.)))

Цитата Сообщение от AzAtom Посмотреть сообщение
Он ещё и для всех полей всех потомков выделяет память. Тоже интересно.
Ну да. Этакий черный ящик под видом процедуры. Хотя дизассемблирование показало что-то типа связки GetMem/FillChar, что вполне примитивно и логично - размеры полей известны.

Но я, собственно, выяснил, что хотел, Create - это, скорее, дирестива компилятору, чем процедура/функция.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
02.09.2023, 18:01
Если так смотреть, то всё написанное - директивы компилятору.
1
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
03.09.2023, 02:07
Цитата Сообщение от Constcat Посмотреть сообщение
Пустое тело, даже ассемблер не показали. А может я хочу свой аллокатор памяти там использовать, может мне делфийский не устраивает?
Этот код зашит в компилятор. Придумывают и пишут сей код разработчики компилятора. А это код т.н. более низкого уровня. Про который разработчику прикладных программ знать необязательно и даже вредно. Ибо сей код может быть изменён без предупреждения.
А свой "аллокатор памяти" использовать никому не запрещено. Их и так уже было и есть более чем один. Вот только для этого не надо влезать на низкий уровень.
1
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
03.09.2023, 13:51  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Про который разработчику прикладных программ знать необязательно и даже вредно.
Что вредно и что полезно знать разработчику - пусть решает разработчик.
В конце-концов, он не малое дитя, чтобы кто-то определял ему вредное и полезное.
1
462 / 185 / 32
Регистрация: 04.08.2018
Сообщений: 732
03.09.2023, 21:57
Цитата Сообщение от Constcat Посмотреть сообщение
Что вредно и что полезно знать разработчику - пусть решает разработчик.
В конце-концов, он не малое дитя, чтобы кто-то определял ему вредное и полезное.
Вот они и определяют, что ЭТО - вредно. Т.к. Эмбракадеро это разработчик, а тех, кого вы называете разработчиками - их клиенты. Клиенты, которые имеют право на техническую поддержку. Если им многое позволить - проблем не оберёшься при поддержке.
3
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
03.09.2023, 23:26  [ТС]
Цитата Сообщение от Rayvenor Посмотреть сообщение
Вот они и определяют, что ЭТО - вредно. Т.к. Эмбракадеро это разработчик, а тех, кого вы называете разработчиками - их клиенты. Клиенты, которые имеют право на техническую поддержку. Если им многое позволить - проблем не оберёшься при поддержке.
Так на то она и поддержка, чтобы разруливать эти проблемы))))
В моем понимании, разработчик должен стремиться к тому, чтобы понимать, что именно и каким образом выполняется "за кадром". Собственно, я именно такую школу и проходил. Лазил в памяти по сегментам данных, ковырялся в регистрах процессора, подменял PSP, перехватывал прерывания, боролся с нереентрантностью DOS при попытке писать резидентные программы, и т.д., и т.п.
Разумеется, все из этого в современном программировании уже не нужно для разработки, но понимание, как оно работает в принципе, очень облегчает процесс программирования.
Зачем далеко ходить? Взять ту же Turbo Vision, где все это только начиналось - там были исходники со всеми потрохами и все было открыто и доступно. И никто не считал разработчиков за неразумных детей, которым что-то вредно знать.
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
04.09.2023, 01:52
Цитата Сообщение от Constcat Посмотреть сообщение
В моем понимании, разработчик должен стремиться к тому, чтобы понимать, что именно и каким образом выполняется "за кадром". Собственно, я именно такую школу и проходил. Лазил в памяти по сегментам данных, ковырялся в регистрах процессора, подменял PSP, перехватывал прерывания, боролся с нереентрантностью DOS при попытке писать резидентные программы, и т.д., и т.п.
Так в чём же тогда проблема?
Цитата Сообщение от Constcat Посмотреть сообщение
Взять ту же Turbo Vision, где все это только начиналось - там были исходники со всеми потрохами и все было открыто и доступно.
Я в этом не уверен, но за старостью лет не поручусь головой.
Но даже если это было так, то это было тогда, когда деревья были большими, а трава зеленая. И не было таких гонок с новыми версиями.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
04.09.2023, 08:31
Цитата Сообщение от Constcat Посмотреть сообщение
Так на то она и поддержка, чтобы разруливать эти проблемы))))
Проблемы, созданные на ровном месте очень/слишком любознательными клиентами?

Цитата Сообщение от Constcat Посмотреть сообщение
Взять ту же Turbo Vision, где все это только начиналось - там были исходники со всеми потрохами и все было открыто и доступно.
А в модулях BP была видна реализация выделения памяти при создании объектов?
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
04.09.2023, 09:24  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Проблемы, созданные на ровном месте очень/слишком любознательными клиентами?
Разработчик и должен быть очень/слишком любознательным. Это одно из необходимых качеств программиста.

Цитата Сообщение от AzAtom Посмотреть сообщение
А в модулях BP была видна реализация выделения памяти при создании объектов?
Ты не поверишь))))
Pascal
1
2
3
4
5
6
7
8
9
10
11
constructor TObject.Init;
type
  Image = record
    Link: Word;
    Data: record end;
  end;
begin
{$IFNDEF Windows}
  FillChar(Image(Self).Data, SizeOf(Self) - SizeOf(TObject), 0);
{$ENDIF}
end;
И все остальные Init'ы тоже присутствуют - где паскалевским текстом, где ассемблерными вставками.
Но напомню, что object'ы по умолчанию не были указателями, память для них выделялась на этапе описания.

Добавлено через 20 минут
Цитата Сообщение от northener Посмотреть сообщение
Так в чём же тогда проблема?
Проблема в том, что часть функционала, который был раньше доступен для анализа и изучения, перемещен в компилятор, потому что кто-то решил, что знать этот функционал вредно.
0
Злостный нарушитель
 Аватар для Verevkin
10886 / 5822 / 1288
Регистрация: 12.03.2015
Сообщений: 26,880
04.09.2023, 09:30
Цитата Сообщение от Constcat Посмотреть сообщение
кто-то решил, что знать этот функционал вредно.
1
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
05.09.2023, 02:43
Цитата Сообщение от Constcat Посмотреть сообщение
Проблема в том, что часть функционала, который был раньше доступен для анализа и изучения, перемещен в компилятор, потому что кто-то решил, что знать этот функционал вредно.
Ну я был не совсем прав, употребляя слово вредно. Признаюсь в этом.
Но подумайте о следующем. Код создания базового класса вполне следовало зашить в компилятор и таким образом съэкономить парочку наносекунд. Код компилятора представлять на всеобщее обозрение - ну это как-то не правильно.
Так вот и вопрос к вам. А нафига вам это?
Только ли это любопытство?
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
05.09.2023, 08:49  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Код создания базового класса вполне следовало зашить в компилятор и таким образом съэкономить парочку наносекунд. Код компилятора представлять на всеобщее обозрение - ну это как-то не правильно.
Ну как-то же в Borland Pascal не постеснялись? Где не получилось на Паскале, там ассемблером)))

Цитата Сообщение от northener Посмотреть сообщение
Так вот и вопрос к вам. А нафига вам это?
Только ли это любопытство?
Любопытство, самообразование и различные занудные вопросы из разряда: "Почему нельзя экземпляр класса создать через New?", "Можно ли каким-то образом добиться от object (не от class) старого поведения, которое было в Borland Pascal?". Чисто академический интерес))) Я сюда эти вопросы даже не закидываю, погонят пиво пить и назовут занудой)))))
0
05.09.2023, 11:40

Не по теме:

а можно сделать чтобы деревья были выше и трава зеленее, и одноклассницы моложе?
ведь было же нормально все, кто все поломал?

0
05.09.2023, 12:55  [ТС]

Не по теме:

Цитата Сообщение от krapotkin Посмотреть сообщение
а можно сделать чтобы деревья были выше и трава зеленее, и одноклассницы моложе?
ведь было же нормально все, кто все поломал?
В данном случае, все очень хорошо знают, кто поломал, и кто виноват, что объект это только указатель)))))))

0
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
05.09.2023, 17:51
Цитата Сообщение от northener Посмотреть сообщение
Но подумайте о следующем. Код создания базового класса вполне следовало зашить в компилятор и таким образом съэкономить парочку наносекунд. Код компилятора представлять на всеобщее обозрение - ну это как-то не правильно.
С интересом наблюдал за дискуссией. Не возражаете, если я тоже выскажусь?

"вполне следовало зашить в компилятор" - на мой взгляд, слишком сильная фраза. Это либо абсолютная истина, либо совсем наоборот.

Да и последствия, Вами заявленные, могут не случиться. И тоже совсем наоборот.

Но это так, придирки. Значительно сильнее меня заинтересовало понятие "базовый класс". Буду признателен, если объясните, что именно Вы имеете ввиду. В моём понимании базовый класс ничем принципиально не отличается от любого своего потомка, а, соответственно, давать ему какие-либо преференции непонятно зачем. Более того, программисту никто не запрещает определять свои базовые классы. (Ну, если я правильно понимаю суть этого термина).

Да и вообще, мне кажется, что вся дискуссия крутится не вокруг директива/не директива, конструктор/процедура, а связана с тем, что Борланды (или как они теперь называются) возвели тип class в ранг особого, если хотите, придворного типа в Delphi, который стоит особняком, и с ним непозволительны стандартные, опять же, если хотите, привычные операции, допустимые с остальными типами. (Hапример, ТС выше спрашивал, почему нельзя создать экземпляр с помощью New? Ведь был же соответствующий механизм, который, кстати, и остался.)

Так что, вопрос... как-бы так выразиться, чтоб никого не обидеть ..."неуважения" разработчиков к клиенту налицо, никуда не делся и разрешения его не заметно...

P.S. Пиво пил. Не помогло...
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
05.09.2023, 18:02
Цитата Сообщение от XpomAI Посмотреть сообщение
программисту никто не запрещает определять свои базовые классы. (Ну, если я правильно понимаю суть этого термина).
Базовый класс только один - TObject. Другое дело, что применительно к своей группе классов мы можем назвать базовым наш класс, но он всё равно всегда будет неявно происходить от по настоящему базового TObject.
0
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
05.09.2023, 18:06
В данном конкретном случае - да, один. Но это и есть следствие привилегированности.

И остаётся открытым вопрос - что такое базовый класс? Что мы вкладываем в это понятие? Возможно, я и Вы говорим о разных вещах. Тогда понятно, что мы можем не сходиться в мнениях.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.09.2023, 18:06

how can i create mainmenu with any fonts wich i wont and how can i create mainmenu with diferent style?
please tell me how can i create mainmenu with any fonts wich i wont and how can i create mainmenu with diferent style?

CREATE SEQUENCE - ошибка синтаксиса в "CREATE"
Выполняю некоторое задание по вузу, в ERBuilder создаются таблицы, связи между ними задаются, добавляются последовательности(или триггеры),...

Каждую группу из n последовательно стоящих символов ‘’ (пробел) и '\t' (табуляция) заменить на один пробел
Каждую группу из n последовательно стоящих символов ‘’ (пробел) и '\t' (табуляция) заменить на один пробел

В строке заменить пробел между слов на запятую и пробел
В строке заменить пробел между слов на запятую и пробел

Заменить неразрывный пробел NBSP на обычный пробел в файле
здравствуйте написал скрипт: with open('russianSpeaking.js', 'r', encoding='utf-8') as f: # чтение из файла f_text = f.read() ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru