C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Speicherverwaltung
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Torsten Mohr
Guest





PostPosted: Sat Nov 08, 2003 5:40 pm    Post subject: Speicherverwaltung Reply with quote



Hallo,

in mehreren Programmen habe ich bisher eine einfache
Speicherverwaltung gebraucht. Das war dann eine
relativ einfache Klasse, die eine Methode
"ensureSize" hatte, die dann sichergestellt hat, dass
ein Bereich entweder allokiert wird oder sichergestellt
wird, dass er eine bestimmte Länge hat.

Stellt die STL vielleicht irgendwas dieser Art zur
Verfügung?

Wenn ich die oben angegebene Klasse in einer Bibliothek
verwende und ein Programm gegen diese Bibliothek linke,
und in dem Programm AUCH diese Klasse verwende,
funktioniert das dann oder gibt es Probleme beim Linken?


Danke für Tipps,
Torsten.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Martin v. Löwis
Guest





PostPosted: Sun Nov 09, 2003 9:19 am    Post subject: Re: Speicherverwaltung Reply with quote



Torsten Mohr wrote:
Quote:
Stellt die STL vielleicht irgendwas dieser Art zur
Verfügung?

Nein. Zum einen gibt es in der STL keine "Debug"-Funktionen,
zum anderen ist die von Dir beschriebene Funktionalität im
Allgemeinen entweder nicht nötig oder nicht implementierbar;
die STL enthält nur Klassen, die portabel implementierbar
sind.

Konkret frage ich mich, was "ensureSize" macht. Wie genau
ermittelt es, ob ein Bereich alloziert ist?

Ciao,
Martin

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Mohr
Guest





PostPosted: Sun Nov 09, 2003 2:10 pm    Post subject: Re: Speicherverwaltung Reply with quote



Hallo,

Quote:
Konkret frage ich mich, was "ensureSize" macht. Wie genau
ermittelt es, ob ein Bereich alloziert ist?

Ich hab die Klasse und die Methode, um die es geht einfach mal
angehängt. Ich verwende sie, um von einer Klasse eine Antwort
variabler Länge zurückzugeben. Das geht wahrscheilich auch mit
einem std::String, es gehören aber noch zusätzliche Informationen
dazu (die hier nicht aufgeführt sind), nicht NUR ein Speicherbereich.


class MemoryChunk {
private:
static int count;
void init(void);

public:
unsigned char* addr;
bool addr_alloc;
long len;
int nr;

public:
MemoryChunk();
~MemoryChunk();

MemoryChunk(const MemoryChunk& from);

void ensure(long size);
long length(void);
unsigned char* getAddress(void);
};

typedef std::vector<MemoryChunk> Memory;
typedef std::vector<MemoryChunk>::iterator MemoryIter;


Und hier die Funktion:


void MemoryChunk::ensure(long size) {
unsigned char* tmp;

if(!addr_alloc) {
addr = (unsigned char *)malloc(size);
if(addr != NULL) {
addr_alloc = true;
len = size;
memset(addr, 0, len);
return;
}
else {
std::cout << "failed to get " << size << endl;
exit(-1);
}
}

if(len > size) {
len = size;
memset(addr, 0, len);
return;
}

tmp = (unsigned char *) malloc(size);
memset(tmp, 0, size);
if(tmp == NULL) {
std::cout << "failed to get " << size << endl;
exit(-1);
}
free(addr);
addr = tmp;
}

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Sun Nov 09, 2003 5:58 pm    Post subject: Re: Speicherverwaltung Reply with quote

Torsten Mohr wrote:

Quote:
Hallo,

in mehreren Programmen habe ich bisher eine einfache
Speicherverwaltung gebraucht. Das war dann eine
relativ einfache Klasse, die eine Methode
"ensureSize" hatte, die dann sichergestellt hat, dass
ein Bereich entweder allokiert wird oder sichergestellt
wird, dass er eine bestimmte Länge hat.

Stellt die STL vielleicht irgendwas dieser Art zur
Verfügung?

std::vector hat sowas. Die Funktion heißt je nach dem, was du genau
brauchst, reserve() oder resize(). Erstere stellt sicher, daß der
Vektor ohne weitere Allokationen die angegebene Zahl an Elementen
erzeugen kann, zweitere erzeugt die angegebene Zahl an Elementen per
default-Konstruktor.

Quote:
Wenn ich die oben angegebene Klasse in einer Bibliothek
verwende und ein Programm gegen diese Bibliothek linke,
und in dem Programm AUCH diese Klasse verwende,
funktioniert das dann oder gibt es Probleme beim Linken?

Das hängt vom System ab, sollte aber normalerweise funktionieren.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Sun Nov 09, 2003 6:00 pm    Post subject: Re: Speicherverwaltung Reply with quote

"Martin v. Löwis" wrote:

Quote:
Torsten Mohr wrote:
Stellt die STL vielleicht irgendwas dieser Art zur
Verfügung?

Nein. Zum einen gibt es in der STL keine "Debug"-Funktionen,
zum anderen ist die von Dir beschriebene Funktionalität im
Allgemeinen entweder nicht nötig oder nicht implementierbar;
die STL enthält nur Klassen, die portabel implementierbar
sind.

Konkret frage ich mich, was "ensureSize" macht. Wie genau
ermittelt es, ob ein Bereich alloziert ist?

Ich hab das so verstanden, daß ensureSize dafür sorgt, daß der Speicher
allokiert _wird_ ("wird" wurde auch in seinem Text verwendet), nicht
daß sie ermittelt, ob er es schon _ist_.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Martin v. Löwis
Guest





PostPosted: Sun Nov 09, 2003 9:48 pm    Post subject: Re: Speicherverwaltung Reply with quote

Rolf Magnus wrote:


Quote:
Ich hab das so verstanden, daß ensureSize dafür sorgt, daß der Speicher
allokiert _wird_ ("wird" wurde auch in seinem Text verwendet), nicht
daß sie ermittelt, ob er es schon _ist_.

Das verstehe ich allerdings immer noch nicht. Ich lese die
Methodensignatur als

void *ensureSize(size_t bytes_to_ensure);

Wenn die Methode "sicherstellt, dass ein Bereich alloziert wird",
wo ist dann der Unterschied zu "alloziert den Bereich"? MaW: Was
ist der Unterschied zu

void *malloc(size_t);

Ciao,
Martin

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Sun Nov 09, 2003 10:48 pm    Post subject: Re: Speicherverwaltung Reply with quote

"Martin v. Löwis" wrote:

Quote:
Rolf Magnus wrote:


Ich hab das so verstanden, daß ensureSize dafür sorgt, daß der
Speicher allokiert _wird_ ("wird" wurde auch in seinem Text
verwendet), nicht daß sie ermittelt, ob er es schon _ist_.

Das verstehe ich allerdings immer noch nicht. Ich lese die
Methodensignatur als

void *ensureSize(size_t bytes_to_ensure);

Wenn die Methode "sicherstellt, dass ein Bereich alloziert wird",
wo ist dann der Unterschied zu "alloziert den Bereich"? MaW: Was
ist der Unterschied zu

void *malloc(size_t);

Gute Frage. Die wird wohl der OP selbst beantworten müssen.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Mohr
Guest





PostPosted: Sun Nov 09, 2003 11:10 pm    Post subject: Re: Speicherverwaltung Reply with quote

Hallo,

Quote:
Ich hab das so verstanden, daß ensureSize dafür sorgt, daß der
Speicher allokiert _wird_ ("wird" wurde auch in seinem Text
verwendet), nicht daß sie ermittelt, ob er es schon _ist_.

Nein, im Original heisst es:
relativ einfache Klasse, die eine Methode
"ensureSize" hatte, die dann sichergestellt hat, dass
ein Bereich entweder allokiert wird oder sichergestellt
wird, dass er eine bestimmte Länge hat.

Das ist vielleicht zu undeutlich gewesen, ich lege mir eine
Klasse dieser Art an (per new) und schreibe dann Daten
hinein. Wenn der Platz nicht ausreicht, einfach per
"ensureSize" sicherstellen, dass genug Platz da ist.


Grüsse,
Torsten.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Mon Nov 10, 2003 8:56 am    Post subject: Re: Speicherverwaltung Reply with quote

"Torsten Mohr" <tmohr@s.netic.de> schrieb:

Quote:
in mehreren Programmen habe ich bisher eine einfache
Speicherverwaltung gebraucht. Das war dann eine
relativ einfache Klasse, die eine Methode
"ensureSize" hatte, die dann sichergestellt hat, dass
ein Bereich entweder allokiert wird oder sichergestellt
wird, dass er eine bestimmte Länge hat.

Stellt die STL vielleicht irgendwas dieser Art zur
Verfügung?

"Die STL" kenne ich nicht, aber in der C++-Standard-Bibliothek gibt es die
Klassenvorlage »std::vector«:

#include <vector>

void foo()
{
std::vector< int > v(3);
// Stellt sicher, daß im Vektor v Platz für 3 Elemente vom Typ
// int ist.
v.resize(20);
// Stellt sicher, daß in v jetzt Platz für zusätzliche 17 Elemente
// vom Typ int ist. Die alten 3 Elemente bleiben erhalten.
}

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Mon Nov 10, 2003 10:59 am    Post subject: Re: Speicherverwaltung Reply with quote

Torsten Mohr wrote:

Quote:
Hallo,

Konkret frage ich mich, was "ensureSize" macht. Wie genau
ermittelt es, ob ein Bereich alloziert ist?

Ich hab die Klasse und die Methode, um die es geht einfach mal
angehängt. Ich verwende sie, um von einer Klasse eine Antwort
variabler Länge zurückzugeben. Das geht wahrscheilich auch mit
einem std::String, es gehören aber noch zusätzliche Informationen
dazu (die hier nicht aufgeführt sind), nicht NUR ein Speicherbereich.

Schon mal über einen eigenen allocator nachgedacht?

Quote:
class MemoryChunk {
private:
static int count;
void init(void);

public:
unsigned char* addr;
bool addr_alloc;
long len;
int nr;

public:
MemoryChunk();
~MemoryChunk();

MemoryChunk(const MemoryChunk& from);

void ensure(long size);
long length(void);
unsigned char* getAddress(void);
};

typedef std::vector<MemoryChunk> Memory;
typedef std::vector<MemoryChunk>::iterator MemoryIter;


Und hier die Funktion:


void MemoryChunk::ensure(long size) {
unsigned char* tmp;

if(!addr_alloc) {
addr = (unsigned char *)malloc(size);
if(addr != NULL) {
addr_alloc = true;
len = size;
memset(addr, 0, len);
return;
}
else {
std::cout << "failed to get " << size << endl;
exit(-1);
}
}

if(len > size) {
len = size;
memset(addr, 0, len);
return;
}

tmp = (unsigned char *) malloc(size);
memset(tmp, 0, size);
if(tmp == NULL) {
std::cout << "failed to get " << size << endl;
exit(-1);
}

Müßten hier nicht erst mal die Daten kopiert werden? Oder sind die
unwichtig? :-)

Quote:
free(addr);
addr = tmp;
}

Also das, was du da oben beschreibst, bietet ein std::vector doch schon
an. Ob ein eigener Allocator in Frage kommt, hängt davon ab, was die
hier nicht aufgeführten Zusatzinformationen sind, die noch dazugehören.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Mon Nov 10, 2003 11:02 am    Post subject: Re: Speicherverwaltung Reply with quote

Markus Schaaf wrote:

Quote:
#include <vector

void foo()
{
std::vector< int > v(3);
// Stellt sicher, daß im Vektor v Platz für 3 Elemente vom Typ
// int ist.
v.resize(20);
// Stellt sicher, daß in v jetzt Platz für zusätzliche 17
Elemente // vom Typ int ist. Die alten 3 Elemente bleiben
erhalten.
}

Eigentlich werden die Elemente gleich erzeugt. Wenn man nur
sicherstellen will, daß genug Platz ist, reicht ein reserve() aus.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Robitzki
Guest





PostPosted: Mon Nov 10, 2003 5:28 pm    Post subject: Re: Speicherverwaltung Reply with quote

Torsten Mohr wrote:

Quote:
Hallo,


Konkret frage ich mich, was "ensureSize" macht. Wie genau
ermittelt es, ob ein Bereich alloziert ist?


Ich hab die Klasse und die Methode, um die es geht einfach mal
angehängt.
selbst gebauter vector


Quote:
tmp = (unsigned char *) malloc(size);
memset(tmp, 0, size);
if(tmp == NULL) {

Wetten, das Du diese Zeile nie sehen wirst? Wink
Quote:
std::cout << "failed to get " << size << endl;
exit(-1);
}
free(addr);
addr = tmp;
}


Und da Deine Klasse keinen Zuweisungsoperator definiert, dürfte es wohl
spätestens knallen, wenn Du mal ein paar mehr MemoryChunks verwendest.

mfg Torsten

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Mon Nov 10, 2003 9:02 pm    Post subject: Re: Speicherverwaltung Reply with quote

Torsten Mohr wrote:

Quote:
Hallo,

Ich hab das so verstanden, daß ensureSize dafür sorgt, daß der
Speicher allokiert _wird_ ("wird" wurde auch in seinem Text
verwendet), nicht daß sie ermittelt, ob er es schon _ist_.

Nein, im Original heisst es:
relativ einfache Klasse, die eine Methode
"ensureSize" hatte, die dann sichergestellt hat, dass
ein Bereich entweder allokiert wird oder sichergestellt
wird, dass er eine bestimmte Länge hat.

Das ist vielleicht zu undeutlich gewesen, ich lege mir eine
Klasse dieser Art an (per new) und schreibe dann Daten
hinein. Wenn der Platz nicht ausreicht, einfach per
"ensureSize" sicherstellen, dass genug Platz da ist.

Das riecht dann aber sogar noch wesentlich mehr nach einer Aufgabe für
std::vector, nur daß der Speicherplatz da automatisch wächst, und man
das "Sicherstellen" nur zur Optimierung der Allokationen braucht.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Mohr
Guest





PostPosted: Tue Nov 18, 2003 11:12 pm    Post subject: Re: Speicherverwaltung Reply with quote

Quote:
tmp = (unsigned char *) malloc(size);
memset(tmp, 0, size);
if(tmp == NULL) {

Wetten, das Du diese Zeile nie sehen wirst? Wink
std::cout << "failed to get " << size << endl;

Autsch, danke für den Tipp...


Grüsse,
Torsten.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Mohr
Guest





PostPosted: Tue Nov 18, 2003 11:15 pm    Post subject: Re: Speicherverwaltung Reply with quote

Hi,

Quote:
Das riecht dann aber sogar noch wesentlich mehr nach einer Aufgabe für
std::vector, nur daß der Speicherplatz da automatisch wächst, und man
das "Sicherstellen" nur zur Optimierung der Allokationen braucht.

was ich darin speichern will sind eigentlich eher "reine Bytes",
ich denke da momentan eher an einen String, das passt wahrscheinlich
besser. Einen Vector aus "unchigned char" ist doch wahrscheinlich
zu ineffizient.


Grüsse,
Torsten.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.