Custom Allocator fuer std::vector
-
Wenn ich einen Vector erstelle weiss ich immer schon genau wie viele Elemente drin sein werden. Die Groesse veraendert sich auch bis zum Programmende nicht. Es wird also kein push_back (und es werden keine Elemente geloescht). Die Daten kommen aus einer Datei, und die groesse weiss ich wenn ich die Datei lese.
std::vector<unsigned int>vec(COUNT);
-
Wie gross ist der benoetigte Speicher und was bedeutet lang (in Sekunden bitte)? Mit welcher Frequenz benoetigst du diesen Speicher? Wie gross ist COUNT?
Die Daten kommen aus einer Datei
Kann es sein, dass das Lesen der Datei lange dauert nicht die Speicherallokation? Wie misst du die Zeit? Was misst du?
-
Ok, kann noch ein Problemchen geben. Dein vector ist viel größer als das RAM und liegt zu großen Teilen in der Auslagerungsdatei. Ist das so? Dann ist:
Da haste bei der Konstruktion des vectors für das bloße Besorgen des Speichers auch noch keine Kosten, aber der vector ist so bescheuert, daß er alle seine Elemente erstmal initialisiert, im falle von vector<unsigned int>, meint er, die alle erstmal mit 0 beschreiben zu müssen. Du hättest nur dieses Problem zu beheben, nimm vielleicht einfach mal testhalber rohen Speicher und vergleiche.
-
Oder nimm
reserve().
-
ChefDerDeutschenBank schrieb:
Die Groesse veraendert sich auch bis zum Programmende nicht. Es wird also kein push_back (und es werden keine Elemente geloescht).
Warum nimmst du dann nicht den seit C++11 etablierten Array?
Gruß,
-- Klaus.
-
Klaus82 schrieb:
Warum nimmst du dann nicht den seit C++11 etablierten Array?
ChefDerDeutschenBank schrieb:
Die Daten kommen aus einer Datei, und die groesse weiss ich wenn ich die Datei lese.
compile-time fstream 4tw!

-
Desdemona schrieb:
compile-time fstream 4tw!

Und auf Deutsch?

Gruß,
-- Klaus.
-
Klaus82 schrieb:
Warum nimmst du dann nicht den seit C++11 etablierten Array?
Das gibts schon seit TR1.
-
Klaus82 schrieb:
Und auf Deutsch?

std::array hat eine Größe, die zur Compilezeit feststehen muss. Die Größe wird aber erst zur Laufzeit aus der Datei gelesen. Daher kann std::array nicht verwendet werden.
-
knivil schrieb:
Klaus82 schrieb:
Warum nimmst du dann nicht den seit C++11 etablierten Array?
Das gibts schon seit TR1.
Jo,
aber jetzt lässt es sich einfach so verwenden, ohne ein zusätzliches Fass aufzumachen.
nwp3 schrieb:
std::array hat eine Größe, die zur Compilezeit feststehen muss. Die Größe wird aber erst zur Laufzeit aus der Datei gelesen. Daher kann std::array nicht verwendet werden.
Also folgendes funktioniert bei mir, geht also auch zur Laufzeit.
#include <array> #include <iostream> int main() { // das Einlesen der Datei sagt, dass 10 Elemente benötigt werden unsigned int const n = 10; std::array<double,n> arr; arr[0] = 1.5; std::cout << arr[0] << std::endl; return 0; }Gruß,
-- Klaus.
-
Dann lass mal das const beim n weg.
-
manni66 schrieb:
Dann lass mal das const beim n weg.
Ja schon klar, dann funktioniert es nicht.

Aber nachdem ich eben schreiben kann
int const n = funktionDieMirDieNoetigeZahlAnElementenAusDateiLiefert();ist doch alles in Butter - zur Laufzeit.
Gruß,
-- Klaus.
-
Klaus82 schrieb:
ist doch alles in Butter - zur Laufzeit.
Ja, zur Laufzeit.
Templateparameter sind aber Teil des Typen und Typen werden zur COMPILE-Zeit bestimmt. Da kannst du keine Laufzeitvariable hin tun.
-
Klaus82 schrieb:
manni66 schrieb:
Dann lass mal das const beim n weg.
Ja schon klar, dann funktioniert es nicht.

Aber nachdem ich eben schreiben kann
int const n = funktionDieMirDieNoetigeZahlAnElementenAusDateiLiefert();ist doch alles in Butter - zur Laufzeit.
Gruß,
-- Klaus.Da ist beim Array nichts in Butter... Laufzeitkonstant reicht bei Templates nicht.
-
Nathan schrieb:
Klaus82 schrieb:
ist doch alles in Butter - zur Laufzeit.
Ja, zur Laufzeit.
Templateparameter sind aber Teil des Typen und Typen werden zur COMPILE-Zeit bestimmt. Da kannst du keine Laufzeitvariable hin tun.Also ist diese
constDefinition ein workaround?Gruß,
-- Klaus.
-
Klaus82 schrieb:
Nathan schrieb:
Klaus82 schrieb:
ist doch alles in Butter - zur Laufzeit.
Ja, zur Laufzeit.
Templateparameter sind aber Teil des Typen und Typen werden zur COMPILE-Zeit bestimmt. Da kannst du keine Laufzeitvariable hin tun.Also ist diese
constDefinition ein workaround?Gruß,
-- Klaus.Wenn du folgendes hast:
const int i = 5;Ist der Compiler in der Lage i hardzucoden, überall dort wo i steht, steht dann im Programmcode quasi 5. Deshalb kannst du das auch als Templateparameter nutzen.
Ersetzt du das aber durch bspw:const int i = foo();Kann diese Optimierung nicht stattfinden. Es gibt dann lediglich einen Fehler, wenn du versuchst i zu ändern. Dann kannst du das nicht mehr als Templateparameter verwenden, obowhl du kaum was geändert hast.
Aus diesem Grund gibt es seit C++11 constexpr, dann gibt es einen Fehler, wenn du das versuchst zu machen.