maximal nutzbare Größe von std::vector
-
Hallo,
in Regel ist die Größe von std::vector sicher durch den Speicher beschränkt und man bekommt einfach ein std::bad_alloc, wenn man zuviel anfordert. Mit der Spezialisierung von std::vector<bool> kann man aber auf einem 32-Bit System an die Grenzen gehen. Ich hätte erwartet, dass folgendes funktioniert:
#include <vector> #include <limits> #include <iostream> int main() { try { std::cout << "max vector<bool>::size_type: " << std::numeric_limits<std::vector<bool>::size_type>::max() << std::endl; std::vector<bool>::size_type size = std::numeric_limits<std::vector<bool>::size_type>::max(); std::vector<bool> big(size, false); //Unbehandelte Ausnahme bei 0x5AD84E43 (msvcr110d.dll) in SieveOfEratosthanes1.exe: Ein ungültiger Parameter wurde an eine Funktion übergeben, die ungültige Parameter als schwerwiegend einstuft. } catch (std::bad_alloc& a) { std::cout << "Zu wenig Speicher"; } }
Bei meiner Implementierung der Standardbibliothek muss ich 31 abziehen, damit ich den Vector instanzieren kann.
std::vector<bool>::size_type size = std::numeric_limits<std::vector<bool>::size_type>::max()-31;
Das ist aber noch nicht alles, wenn ich jetzt auf ein Element mit einem größerem Index zugreifen will, bekomme ich wieder eine Zugriffsverletzung.
Das liegt daran, dass der Operator[] durch Iterator begin() + index implementiert ist.#include <vector> #include <limits> #include <iostream> int main() { try { std::vector<bool>::size_type size = std::numeric_limits<std::vector<bool>::size_type>::max() - 31; std::cout << "create vector with size: " << size << std::endl; std::vector<bool> big(size, false); std::cout << "max vector<bool>::difference_type: " << std::numeric_limits<std::vector<bool>::difference_type>::max() << std::endl; std::vector<bool>::size_type index = std::numeric_limits<std::vector<bool>::difference_type>::max(); std::cout << "access with index = " << index << std::endl; big[index] = true; // ok ++index; std::cout << "access with index = " << index << std::endl; big[index] = true; // vector subscript out of range } catch (std::bad_alloc& a) { std::cout << "Zu wenig Speicher"; } }
Ich verwende MS Visual Studio Express 2012 (Desktop Version). Gebaut für 32 Bit, ausgeführt auf einem 64Bit System mit 8 MB Ram. Das Problem liegt hier sicher in der Implementierung der Standardbibliothek.
Sagt der Standard hier noch was über die maximal nutzbarer Größe? Auch die Funktion max_size() hilft nicht weiter, die gibt auch nur den Maximalwert von size_type zurück.#include <vector> #include <limits> #include <iostream> int main() { std::cout << "max vector<bool>::size_type: " << std::numeric_limits<std::vector<bool>::size_type>::max() << std::endl; std::vector<bool> size_test; std::cout << "max std::vector<bool>::max_size(): " << size_test.max_size() << std::endl; }
Wozu ist max_size() eigentlich gedacht? Ist die Wahl des difference_type als signed 32 Bit ein Designfehler, wenn sich ein größerer vector instanzieren läßt? Gibt es eine allgemeingültige Funktion mit der ich die maximal nutzbare Größe von std::vector bestimmen kann?
-
DJohn schrieb:
Designfehler
Damit hast du vector<bool> treffend beschrieben. Mit boost::dynamic_bitset oder einer eigenen Lösung bist du besser dran.