PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c++ Delphi]: Pointerlisten und Speicher?


pajofego
2007-11-14, 00:10:54
Guten Abend zusammen.

Ich versuche mich gerade einige Teile von TList aus Delphi in C++ anzuwenden.

Es geht dabei um folgenden Codeabschnitt in TList:


MaxListSize = Maxint div 16;
...
PPointerList = ^TPointerList;
TPointerList = array[0..MaxListSize - 1] of Pointer;
...
function TList.Add(Item: Pointer): Integer;
begin
Result := FCount;
if Result = FCapacity then
Grow;
FList^[Result] := Item;
...
end;


Ich habe nur erst einmal den für mich relevanten Codeabschnitt dargestellt. Das ganze habe ich in C++ in Form einer Template Klasse wie versucht darzustellen:


#include <climits>
#include <stdlib.h>
#include <stdio.h>

template <class T>
class TList
{
public:
TList();
~TList();
int Add(T *Item);
void Grow();
private:
T** m_pList;
int m_lCount;
int m_lCapacity;
};

template <class T> TList<T>::TList()
{
m_pList = new T* [INT_MAX / 16 - 1];
m_lCount = 0;
m_lCapacity = 0;
return;
}

template <class T> TList<T>::~TList()
{
assert(NULL == m_pList);
assert(0 == m_lCount);
return;
}

template <class T>
int TList<T>::Add(T *Item)
{
if (m_lCount == m_lCapacity)
Grow();
m_pList[m_lCount] = Item;
return m_lCount++;
}

template <class T> void TList<T>::Grow()
{
m_lCapacity++;
}


Soweit scheint die Methode Add in C++ zu funktionieren. Wenn ich im Taskmanager auf den Verlauf der Auslagerungsdatei anschaue sobald ich irgendwo in mein Code z.B. folgende Anweisung durchführe:


TList<double> myList;
myList.Add(&a);


steigt der Wert der Auslagerungsdatei um ca. 0.5 GB an. Der Wert in der Prozessliste bleibt solange ich keine allzu große Anzahl an Werte übergebe gleich. In Delphi sehe ich diese Phänomen nicht. Daher meine Frage ob der von mir gegangene Weg wie oben dargestellt überhaupt der gleiche ist wie der in Delphi. Insbesondere der Datentyp Pointer wirft einige Fragen auf. D.h. wie setzt man soetwas konkret in C++ um?

Danke,
Gruß
pajofego

Gauß
2007-11-15, 17:14:18
Schau dir mal std::vector an.

robobimbo
2007-11-17, 21:04:11
Rechne Dir das mal aus *g*
m_pList = new T* [INT_MAX / 16 - 1];
Du reservierst Dir ja praktisch mit dem ersten Aufruf den maximalen Speicher den die Liste jemals anwenden kann, auch wenn Du nur ein Element belegst.

AchimR
2007-11-21, 21:22:39
Das wichtigste hast du beim Delphicode vergessen, nämlich die Worte 'Type' und 'Var'

Type
PPointerList = ^TPointerList;
TPointerList = array[0..MaxListSize - 1] of Pointer;

Var
FList : PPointerList;

FList ist ein Pointer auf ein Pointerarray, das in der Funktion 'grow' dyn. vergössert wird.
ReallocMem(FList, NewCapacity * SizeOf(Pointer))

Im Prinzip ist das uralter Code der noch von der ersten Delphi-Version stammt, denn z.B. die Angabe der Array-Dimension ist Schwachsinn und diente nur dazu den RangeCheck des Compilers auf's Kreuz zulegen. Aber was läuft, das läuft und deshalb gab wohl es keine Veranlassung den Code zu ändern, denn aktuelle Delphi-Version bieten bessere Möglichkeiten um Pointerlisten zu erstellen. Ich geh mal davon aus, dass das in C++ ebenso ist, evtl. gibt es schon was Fertiges.