 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Torsten Mohr Guest
|
Posted: Sat Nov 08, 2003 5:40 pm Post subject: Speicherverwaltung |
|
|
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
|
Posted: Sun Nov 09, 2003 9:19 am Post subject: Re: Speicherverwaltung |
|
|
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
|
Posted: Sun Nov 09, 2003 2:10 pm Post subject: Re: Speicherverwaltung |
|
|
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
|
Posted: Sun Nov 09, 2003 5:58 pm Post subject: Re: Speicherverwaltung |
|
|
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
|
Posted: Sun Nov 09, 2003 6:00 pm Post subject: Re: Speicherverwaltung |
|
|
"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
|
Posted: Sun Nov 09, 2003 9:48 pm Post subject: Re: Speicherverwaltung |
|
|
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
|
Posted: Sun Nov 09, 2003 10:48 pm Post subject: Re: Speicherverwaltung |
|
|
"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
|
Posted: Sun Nov 09, 2003 11:10 pm Post subject: Re: Speicherverwaltung |
|
|
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
|
Posted: Mon Nov 10, 2003 8:56 am Post subject: Re: Speicherverwaltung |
|
|
"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
|
Posted: Mon Nov 10, 2003 10:59 am Post subject: Re: Speicherverwaltung |
|
|
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
|
Posted: Mon Nov 10, 2003 11:02 am Post subject: Re: Speicherverwaltung |
|
|
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
|
Posted: Mon Nov 10, 2003 5:28 pm Post subject: Re: Speicherverwaltung |
|
|
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?
| 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
|
Posted: Mon Nov 10, 2003 9:02 pm Post subject: Re: Speicherverwaltung |
|
|
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
|
Posted: Tue Nov 18, 2003 11:12 pm Post subject: Re: Speicherverwaltung |
|
|
| Quote: | tmp = (unsigned char *) malloc(size);
memset(tmp, 0, size);
if(tmp == NULL) {
Wetten, das Du diese Zeile nie sehen wirst?
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
|
Posted: Tue Nov 18, 2003 11:15 pm Post subject: Re: Speicherverwaltung |
|
|
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 |
|
 |
|
|
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
|
|