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.


Log in to reply