bool initialisieren mit memset
-
Was spricht gegen so ein Vorgehen um beim init alles auf false zu setzen? Oder sollte man eine Schleife Verwenden?
bool array[10000]; memset(&array, 0, 10000 * sizeof(bool));
-
std::bitset<10000> array(0);
-
Fellhuhn schrieb:
std::bitset<10000> array(0);Wie ist es mit Release Modi und memory alignment?
Schreibt es nur zusammenhängende Datenblöcke?
Was passiert wenn mein Datenblock nicht zusammenhängend ist?
-
Da spricht prinzipiell nichts gegen, wenn man C macht (außer dass ich ein 10000 Elemente Array nicht auf den Stack legen würde). Aber warum nicht die C++-Methoden (z.B. std::fill)verwenden? Denn dann könntest du die gleichen Methoden nicht nur für primitive Datentypen, sondern für alle Objektklassen benutzen (memset wird bei komplexen Datentypen versagen). Und du verlierst nichts*.
*: Ich ahne schon, dass diese Bemerkung zu einem Benchmarkwettbewerb führen wird, bei dem gezeigt wird, dass fill in VS6 um 7,34% langsamer ist als memset
.
-
bool_ schrieb:
Fellhuhn schrieb:
std::bitset<10000> array(0);Wie ist es mit Release Modi und memory alignment?
Schreibt es nur zusammenhängende Datenblöcke?
Was passiert wenn mein Datenblock nicht zusammenhängend ist?Die Interna der Klasse brauchen dich nicht zu interessieren. Das ist ja gerade das schöne daran. Denn: Warum sollte das wichtig sein?
-
bool_ schrieb:
Was spricht gegen so ein Vorgehen um beim init alles auf false zu setzen? Oder sollte man eine Schleife Verwenden?
bool array[10000]; memset(&array, 0, 10000 * sizeof(bool));Wenn du ein nacktes Array verwenden willst, solltest du es so initialisieren:
bool array[10000] = {};Lars
-
SeppJ schrieb:
Da spricht prinzipiell nichts gegen, wenn man C macht (außer dass ich ein 10000 Elemente Array nicht auf den Stack legen würde). Aber warum nicht die C++-Methoden (z.B. std::fill)verwenden? Denn dann könntest du die gleichen Methoden nicht nur für primitive Datentypen, sondern für alle Objektklassen benutzen (memset wird bei komplexen Datentypen versagen). Und du verlierst nichts*.
Fellhuhn schrieb:
std::bitset<10000> array(0);Wieso kommt keiner auf die Idee, ihm zu sagen, dass er das Array gleich ordentlich initialisieren kann statt es später zu befüllen?
bool array[10000] = {0};
-
SeppJ schrieb:
bool_ schrieb:
Fellhuhn schrieb:
std::bitset<10000> array(0);Wie ist es mit Release Modi und memory alignment?
Schreibt es nur zusammenhängende Datenblöcke?
Was passiert wenn mein Datenblock nicht zusammenhängend ist?Die Interna der Klasse brauchen dich nicht zu interessieren. Das ist ja gerade das schöne daran. Denn: Warum sollte das wichtig sein?
Wenn man es an eine bestehende, nicht änderbare Funktion (die ein bool-array erwartet?) übergeben muss, ist das wichtig. Und dann funktioniert das bitset wohl eher nicht.
Lars
-
manni66 schrieb:
Wenn man es an eine bestehende, nicht änderbare Funktion (die ein bool-array erwartet?) übergeben muss, ist das wichtig. Und dann funktioniert das bitset wohl eher nicht.
Ach ja, guter alter geerbter Code mit schlechtem Interface, der nie geändert werden darf. Wer hat das noch nicht erlebt?
Hast natürlich recht.
Falls dieser Fall hier vorliegen sollte: std::vector wäre zwar binärkompatibel mit Arrays, jedoch die unseelige Spezialisierung vector<bool> macht hier alles kaputt
. Da müsste man dann wohl zu einem gecasteten vector<char> greifen. Da das aber umständlich ist, wohl doch lieber das nullininitialisierte Array, welches schon mehrmals genannt wurde.