Воскресенье, 29 Сентября 2024, 02:15

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
заполнение масива объектами разных поколений
KventenДата: Четверг, 29 Ноября 2012, 14:23 | Сообщение # 1
был не раз
Сейчас нет на сайте
народ просветите что происходит в памяти компа, если в ячейки массива родительского типа пишутся дочерние типы разных поколений?

например:
TA = class
...
end;
TB = class(TA)
...
end;
TC = class(TB)
...
end;

Aa: array [0..highAaa] of TA;

Aa[0]:=TB.Create;
Aa[1]:=TC.Create;
Aa[2]:=TA.Create;
Aa[3]:=TC.Create;

элементы разной длины ведь получаются и непонятно как продолжает работать индексирование.
Или в памяти в этом случае создается последовательная цепь указателей на объекты, а сами объекты разбрасываются в памяти произвольно?


Сообщение отредактировал Kventen - Четверг, 29 Ноября 2012, 14:35
TimKruzДата: Четверг, 29 Ноября 2012, 23:23 | Сообщение # 2
старожил
Сейчас нет на сайте
Массив данных - это целый блок памяти, кратный количеству ячеек массива и размеру одной ячейки (число ячеек * размер одной ячейки = размер массива). Память под массив выделяется программой во время её загрузки, т.е. требуемый размер должен быть известен заранее, ещё на этапе написания программы.

То, что у тебя Aa[номер] - это не сам экземпляр класса, а лишь указатель на него (размер указателя заранее известен, а сам указатель должен иметь значение nil, хотя наверняка там мусор будет). Конструктор класса (TA.Create) после создания нового экземпляра возвращает указатель на него, и мы его сохраняем (можно не сохранять...) в заранее описанной переменной для последующего обращения к экземпляру.
Сам экземпляр помещается в любом свободном участке памяти.
Можно, например, описать переменную p:pointer и присваивать ей aa[номер] или наоборот, потому что по сути и то, и другое - просто указатели.

Quote (Kventen)
Или в памяти в этом случае создается последовательная цепь указателей на объекты, а сами объекты разбрасываются в памяти произвольно?

Это всё происходит в любом случае. В разделе var описываются переменные-указатели (если нужны), а экземпляры создаются с помощью конструктора класса.


KventenДата: Пятница, 30 Ноября 2012, 13:52 | Сообщение # 3
был не раз
Сейчас нет на сайте
Quote (TimKruz)
в любом случае
спосиб
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг