<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[maximal nutzbare Größe von std::vector]]></title><description><![CDATA[<p>Hallo,</p>
<p>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&lt;bool&gt; kann man aber auf einem 32-Bit System an die Grenzen gehen. Ich hätte erwartet, dass folgendes funktioniert:</p>
<pre><code>#include &lt;vector&gt;
#include &lt;limits&gt;
#include &lt;iostream&gt;

int main()
{
	try
	{
		std::cout &lt;&lt; &quot;max vector&lt;bool&gt;::size_type: &quot; &lt;&lt; std::numeric_limits&lt;std::vector&lt;bool&gt;::size_type&gt;::max() &lt;&lt; std::endl;
		std::vector&lt;bool&gt;::size_type size = std::numeric_limits&lt;std::vector&lt;bool&gt;::size_type&gt;::max();
		std::vector&lt;bool&gt; 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&amp; a)
	{
		std::cout &lt;&lt; &quot;Zu wenig Speicher&quot;;
	}
}
</code></pre>
<p>Bei meiner Implementierung der Standardbibliothek muss ich 31 abziehen, damit ich den Vector instanzieren kann.</p>
<pre><code>std::vector&lt;bool&gt;::size_type size = std::numeric_limits&lt;std::vector&lt;bool&gt;::size_type&gt;::max()-31;
</code></pre>
<p>Das ist aber noch nicht alles, wenn ich jetzt auf ein Element mit einem größerem Index zugreifen will, bekomme ich wieder eine Zugriffsverletzung.<br />
Das liegt daran, dass der Operator[] durch Iterator begin() + index implementiert ist.</p>
<pre><code>#include &lt;vector&gt;
#include &lt;limits&gt;
#include &lt;iostream&gt;

int main()
{
	try
	{
		std::vector&lt;bool&gt;::size_type size = std::numeric_limits&lt;std::vector&lt;bool&gt;::size_type&gt;::max() - 31; 
		std::cout &lt;&lt; &quot;create vector with size: &quot; &lt;&lt; size &lt;&lt; std::endl;
		std::vector&lt;bool&gt; big(size, false);
		std::cout &lt;&lt; &quot;max vector&lt;bool&gt;::difference_type: &quot; &lt;&lt; std::numeric_limits&lt;std::vector&lt;bool&gt;::difference_type&gt;::max() &lt;&lt; std::endl;
		std::vector&lt;bool&gt;::size_type index = std::numeric_limits&lt;std::vector&lt;bool&gt;::difference_type&gt;::max();
		std::cout &lt;&lt; &quot;access with index = &quot; &lt;&lt; index &lt;&lt; std::endl;
		big[index] = true;  // ok
		++index;
		std::cout &lt;&lt; &quot;access with index = &quot; &lt;&lt; index &lt;&lt; std::endl;
		big[index] = true;  // vector subscript out of range 

	}
	catch (std::bad_alloc&amp; a)
	{
		std::cout &lt;&lt; &quot;Zu wenig Speicher&quot;;
	}
}
</code></pre>
<p>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.<br />
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.</p>
<pre><code>#include &lt;vector&gt;
#include &lt;limits&gt;
#include &lt;iostream&gt;

int main()
{

		std::cout &lt;&lt; &quot;max vector&lt;bool&gt;::size_type: &quot; &lt;&lt; std::numeric_limits&lt;std::vector&lt;bool&gt;::size_type&gt;::max() &lt;&lt; std::endl;
		std::vector&lt;bool&gt; size_test;
		std::cout &lt;&lt; &quot;max std::vector&lt;bool&gt;::max_size(): &quot; &lt;&lt; size_test.max_size() &lt;&lt; std::endl;
}
</code></pre>
<p>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?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/328312/maximal-nutzbare-größe-von-std-vector</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 02:21:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328312.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 02 Oct 2014 20:27:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to maximal nutzbare Größe von std::vector on Thu, 02 Oct 2014 20:27:31 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>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&lt;bool&gt; kann man aber auf einem 32-Bit System an die Grenzen gehen. Ich hätte erwartet, dass folgendes funktioniert:</p>
<pre><code>#include &lt;vector&gt;
#include &lt;limits&gt;
#include &lt;iostream&gt;

int main()
{
	try
	{
		std::cout &lt;&lt; &quot;max vector&lt;bool&gt;::size_type: &quot; &lt;&lt; std::numeric_limits&lt;std::vector&lt;bool&gt;::size_type&gt;::max() &lt;&lt; std::endl;
		std::vector&lt;bool&gt;::size_type size = std::numeric_limits&lt;std::vector&lt;bool&gt;::size_type&gt;::max();
		std::vector&lt;bool&gt; 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&amp; a)
	{
		std::cout &lt;&lt; &quot;Zu wenig Speicher&quot;;
	}
}
</code></pre>
<p>Bei meiner Implementierung der Standardbibliothek muss ich 31 abziehen, damit ich den Vector instanzieren kann.</p>
<pre><code>std::vector&lt;bool&gt;::size_type size = std::numeric_limits&lt;std::vector&lt;bool&gt;::size_type&gt;::max()-31;
</code></pre>
<p>Das ist aber noch nicht alles, wenn ich jetzt auf ein Element mit einem größerem Index zugreifen will, bekomme ich wieder eine Zugriffsverletzung.<br />
Das liegt daran, dass der Operator[] durch Iterator begin() + index implementiert ist.</p>
<pre><code>#include &lt;vector&gt;
#include &lt;limits&gt;
#include &lt;iostream&gt;

int main()
{
	try
	{
		std::vector&lt;bool&gt;::size_type size = std::numeric_limits&lt;std::vector&lt;bool&gt;::size_type&gt;::max() - 31; 
		std::cout &lt;&lt; &quot;create vector with size: &quot; &lt;&lt; size &lt;&lt; std::endl;
		std::vector&lt;bool&gt; big(size, false);
		std::cout &lt;&lt; &quot;max vector&lt;bool&gt;::difference_type: &quot; &lt;&lt; std::numeric_limits&lt;std::vector&lt;bool&gt;::difference_type&gt;::max() &lt;&lt; std::endl;
		std::vector&lt;bool&gt;::size_type index = std::numeric_limits&lt;std::vector&lt;bool&gt;::difference_type&gt;::max();
		std::cout &lt;&lt; &quot;access with index = &quot; &lt;&lt; index &lt;&lt; std::endl;
		big[index] = true;  // ok
		++index;
		std::cout &lt;&lt; &quot;access with index = &quot; &lt;&lt; index &lt;&lt; std::endl;
		big[index] = true;  // vector subscript out of range 

	}
	catch (std::bad_alloc&amp; a)
	{
		std::cout &lt;&lt; &quot;Zu wenig Speicher&quot;;
	}
}
</code></pre>
<p>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.<br />
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.</p>
<pre><code>#include &lt;vector&gt;
#include &lt;limits&gt;
#include &lt;iostream&gt;

int main()
{

		std::cout &lt;&lt; &quot;max vector&lt;bool&gt;::size_type: &quot; &lt;&lt; std::numeric_limits&lt;std::vector&lt;bool&gt;::size_type&gt;::max() &lt;&lt; std::endl;
		std::vector&lt;bool&gt; size_test;
		std::cout &lt;&lt; &quot;max std::vector&lt;bool&gt;::max_size(): &quot; &lt;&lt; size_test.max_size() &lt;&lt; std::endl;
}
</code></pre>
<p>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?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2420514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2420514</guid><dc:creator><![CDATA[DJohn]]></dc:creator><pubDate>Thu, 02 Oct 2014 20:27:31 GMT</pubDate></item><item><title><![CDATA[Reply to maximal nutzbare Größe von std::vector on Thu, 02 Oct 2014 20:55:30 GMT]]></title><description><![CDATA[<p>DJohn schrieb:</p>
<blockquote>
<p>Designfehler</p>
</blockquote>
<p>Damit hast du vector&lt;bool&gt; treffend beschrieben. Mit boost::dynamic_bitset oder einer eigenen Lösung bist du besser dran.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2420519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2420519</guid><dc:creator><![CDATA[vector_bool_in_a_nutshell]]></dc:creator><pubDate>Thu, 02 Oct 2014 20:55:30 GMT</pubDate></item></channel></rss>