2010-11-26 84 views
2

J'essaie d'allouer dynamiquement un grand tableau dans Ada (bien, un tableau d'un tableau). Par exemple, je suis en mesure d'allouer dynamiquement un objet comme ceci:Allocation de tableau dynamique d'un enregistrement dans Ada

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

J'essaie d'imiter ce code de référence:

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; 

Malheureusement, je suis incapable de le faire même quelque chose comme cela C++ équivalent:

Object *objList = new Object*[500000]; 

je suis venu avec autant jusqu'à présent:

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

Mais je suis probablement loin.

+0

Où se trouve le tableau d'un tableau? – Schedler

+0

De quel "benchmark" parlons-nous? Schedler montre une façon de le faire, mais vous n'avez pratiquement jamais besoin de faire quelque chose comme ça dans Ada (et vous devriez vraiment l'éviter en C++). De plus, le 'new' d'Ada est probablement implémenté comme un appel à la même routine d'OS que celle utilisée par C++. Ainsi, le benchmarking de ses performances d'allocation dynamique est à la fois inutile et stupide. –

Répondre

1

Dans le code Ada votre C++ se traduirait à peu près à ce qui suit:

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; 

Si vous souhaitez utiliser les opérations de répartition avec vos objets (le Object est défini comme un type étiqueté), utilisez Object'class à la place de Object dans la déclaration ObjPtr.