Динамическое выделение массива записи в Аде

Я пытаюсь динамически выделить большой массив в Аде (ну, массив массива). Например, я могу динамически размещать объект следующим образом:

type Object;
type ObjPtr is access Object;
OP : ObjPtr;
-- sometime later
OP := new Object;
OP.Index := I;--OP.Ptr.all;
Free(OP);

Я пытаюсь эмулировать этот эталонный код:

Object **objList = new Object*[500000];
int32_t *iList = new int32_t[500000];
for (int32_t i = 0; i < 500000; ++i)
{
  objList[i] = new Object;
  iList[i] = Object::getIndex(objList[i]);
  delete objList[i];
}
delete[] iList;
delete[] objList;

К сожалению, я даже не могу сделать что-то вроде этого эквивалента С++:

Object *objList = new Object*[500000];

Я придумал это до сих пор:

type objs is array (Positive range <>) of Object;
type objList is access objs;

Но я, наверное, далеко.


person Anthony    schedule 26.11.2010    source источник
comment
Где массив массива?   -  person Schedler    schedule 26.11.2010
comment
О каком эталоне идет речь? Schedler показывает один из способов сделать это, но на самом деле вам почти никогда не нужно делать что-то подобное в Ada (и действительно следует избегать этого и в C++). Кроме того, скорее всего, new в Аде реализован как вызов той же подпрограммы ОС, что и new в C++. Таким образом, оценивать его производительность динамического распределения бессмысленно и глупо.   -  person T.E.D.    schedule 29.11.2010


Ответы (1)


В Аде ваш код на С++ будет примерно следующим:

Alloc_Count : constant := 500_000;
type ObjPtr is access Object;
type ObjArray is array (1 .. Alloc_Count) of ObjPtr;
OA : ObjArray;
begin
   for I in OA'Range loop
   OA(I) := new Object;
   -- ... do the other things
end loop;

Если вы хотите использовать операции диспетчеризации со своими объектами (т. е. Object определяется как теговый тип), используйте Object'class вместо Object в объявлении ObjPtr.

person Schedler    schedule 26.11.2010