<?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[Kurze Verständnisfragen zu Allokatoren und dem &amp;quot;Stateless&amp;quot;]]></title><description><![CDATA[<p>Allokatoren für die Standardbibliothek dürfen, soweit ich mich erinnere, keinen Status haben, wenn sie Kompilerunabhängig sein sollen, richtig? Wieso genau ist dem so?</p>
<p>Und wäre es dann erlaubt, wenn alle Templateallokatoren vom gleichen Typ intern einen Zeiger auf ein globales Objekt haben, welches die Speicherverwaltung übernimmt? Also sowas wie ein globaler Speicherpool für einen Typ. So hätten alle Templateallokatoren ganz sicher den gleichen Status, da sie einfach nur einen Zeiger besitzen und alle Aufgaben an dieses Objekt weiterleiten.</p>
<p>Danke im voraus.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242234/kurze-verständnisfragen-zu-allokatoren-und-dem-quot-stateless-quot</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 01:31:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242234.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 01 Jun 2009 13:09:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kurze Verständnisfragen zu Allokatoren und dem &amp;quot;Stateless&amp;quot; on Mon, 01 Jun 2009 13:09:59 GMT]]></title><description><![CDATA[<p>Allokatoren für die Standardbibliothek dürfen, soweit ich mich erinnere, keinen Status haben, wenn sie Kompilerunabhängig sein sollen, richtig? Wieso genau ist dem so?</p>
<p>Und wäre es dann erlaubt, wenn alle Templateallokatoren vom gleichen Typ intern einen Zeiger auf ein globales Objekt haben, welches die Speicherverwaltung übernimmt? Also sowas wie ein globaler Speicherpool für einen Typ. So hätten alle Templateallokatoren ganz sicher den gleichen Status, da sie einfach nur einen Zeiger besitzen und alle Aufgaben an dieses Objekt weiterleiten.</p>
<p>Danke im voraus.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719051</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 01 Jun 2009 13:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Verständnisfragen zu Allokatoren und dem &amp;quot;Stateless&amp;quot; on Mon, 01 Jun 2009 17:30:14 GMT]]></title><description><![CDATA[<p>Soweit ich weiss ist das einzige Problem, dass Allokatoren kopiert werden (also mit operator = bzw. dem copy-ctor).<br />
Wenn du einen Zeiger verwendest, auf ein Objekt welches sich alle Allokatoren teilen, dann sollte das OK gehen.<br />
Das zweite Problem was du haben wirst, ist, dass Allokatoren per &quot;rebind&quot; auch für andere Typen verwendet werden.<br />
D.h. wenn du einen Allokator für T übergibst, dann muss allocator&lt;T&gt;::rebind&lt;U&gt; auch für Typ U funktionieren.</p>
<p>Und im deutschen sagt man eher Zustand, nicht Status. Oder eben einfach &quot;State&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719206</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 01 Jun 2009 17:30:14 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Verständnisfragen zu Allokatoren und dem &amp;quot;Stateless&amp;quot; on Mon, 01 Jun 2009 18:29:17 GMT]]></title><description><![CDATA[<p>Da ich mal annehme dass der &quot;interne Zeiger&quot; ein statisches Member ist gehört er zur Klasse, nicht zum einzelnen Allokator. Damit ist der Allokator weiterhin stateless.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719246</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 01 Jun 2009 18:29:17 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Verständnisfragen zu Allokatoren und dem &amp;quot;Stateless&amp;quot; on Tue, 02 Jun 2009 21:16:21 GMT]]></title><description><![CDATA[<p>Der Zeiger könnte auch non-static sein.<br />
Angenommen ich habe einen Pool-Allocator, dann hätte dieser z.B. einen shared_ptr auf einen Pool. Wobei es mehrere Pools geben kann.</p>
<p>Nur der Pool wird beim Allocator kopieren eben nicht mit kopiert, sondern bloss der Zeiger auf den Pool.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719990</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 02 Jun 2009 21:16:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Verständnisfragen zu Allokatoren und dem &amp;quot;Stateless&amp;quot; on Tue, 02 Jun 2009 21:30:38 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Der Zeiger könnte auch non-static sein.<br />
Angenommen ich habe einen Pool-Allocator, dann hätte dieser z.B. einen shared_ptr auf einen Pool. Wobei es mehrere Pools geben kann.</p>
<p>Nur der Pool wird beim Allocator kopieren eben nicht mit kopiert, sondern bloss der Zeiger auf den Pool.</p>
</blockquote>
<p>Wenn ich das richtig sehe kann es aber vorkommen, dass ein objekt, das mit &quot;irgendeinem&quot; Allokator allokiert wurde, mit &quot;irgendeinem&quot; anderen deallokiert wird. In dem Beispiel hätte der zweite Allokator ein Objekt zu deallokieren das nicht in seinem pool ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719998</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 02 Jun 2009 21:30:38 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Verständnisfragen zu Allokatoren und dem &amp;quot;Stateless&amp;quot; on Tue, 02 Jun 2009 22:22:09 GMT]]></title><description><![CDATA[<p>Hmmm...<br />
Das wäre dann natürlich doof <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Naja, dass das Standard-Library Allocator Konzept total &quot;broken&quot; ist, ist ja kein Geheimnis in der C++ Szene...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720023</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 02 Jun 2009 22:22:09 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Verständnisfragen zu Allokatoren und dem &amp;quot;Stateless&amp;quot; on Tue, 02 Jun 2009 22:42:15 GMT]]></title><description><![CDATA[<p>Dann müsste man also in jedem Speicherblock zum Beispiel sizeof(void*) zusätzliche Bytes speichern, welche dann einen Zeiger zum korrekten Pool beinhalten? Also auf das, was im Allokator gespeichert ist, darf man überhaupt nicht gehen? Seehr sinnvoll ...<br />
Dann hätte man die Methoden gleich statisch machen können und wieso kann man denn bitte ein Allokator Objekt dem Konstruktor übergeben? Was ist der Sinn dahinter?</p>
<p>Wird dieses Konzept wohl jemals geändert werden? Die Rückwärtskompatibilität wird da wohl jedem Neustart ein Strich durch die Rechnung machen ...</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720034</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 02 Jun 2009 22:42:15 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Verständnisfragen zu Allokatoren und dem &amp;quot;Stateless&amp;quot; on Wed, 03 Jun 2009 01:19:30 GMT]]></title><description><![CDATA[<p>Ahhhh, die Erinnerung setzt ein... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Wenn ich das richtig sehe kann es aber vorkommen, dass ein objekt, das mit &quot;irgendeinem&quot; Allokator allokiert wurde, mit &quot;irgendeinem&quot; anderen deallokiert wird. In dem Beispiel hätte der zweite Allokator ein Objekt zu deallokieren das nicht in seinem pool ist.</p>
</blockquote>
<p>Ich glaube das ist eine &quot;Grauzone&quot; im Standard bzw. dessen Auslegung, oder zumindest was existierende Implementierungen angeht.<br />
Allokatoren müssen nämlich soweit ich weiss den operator == implementieren, und zurückgeben, ob sie &quot;kompatibel&quot; sind. Also in meinem vorgeschlagenen Pool-Fall, ob sie den gleichen Pool verwenden.<br />
Beispiel aus der MSVC 9 Standard-Library, Implementierung von std::vector&lt;T&gt;:</p>
<p>P.J. Plauger schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void swap(_Myt&amp; _Right)
		{	// exchange contents with _Right
		if (this == &amp;_Right)
			;	// same object, do nothing
		else if (this-&gt;_Alval == _Right._Alval)
			{	// same allocator, swap control information

 #if _HAS_ITERATOR_DEBUGGING
			this-&gt;_Swap_all(_Right);
 #endif /* _HAS_ITERATOR_DEBUGGING */

			this-&gt;_Swap_aux(_Right);

			_STD swap(_Myfirst, _Right._Myfirst);
			_STD swap(_Mylast, _Right._Mylast);
			_STD swap(_Myend, _Right._Myend);
			}
		else
			{	// different allocator, do multiple assigns
			this-&gt;_Swap_aux(_Right);

			_Myt _Ts = *this;

			*this = _Right;
			_Right = _Ts;
			}
		}
</code></pre>
</blockquote>
<p>Der &quot;different allocator&quot; Zweig verletzt hierbei auch die O(1) Garantie. Geht IMO auch nicht anders, da Allokatoren AFAIK nicht &quot;no-throw assignable&quot;, und nicht &quot;no-throw swappable&quot; sein müssen. Dadurch kann man die Allokatoren nicht einfach tauschen, da es schief gehen könnte. Und nach dem &quot;schief gehen&quot; könnte ein versuchtes &quot;Undo&quot; ebenfalls schief gehen, und dann wäre man komplett angeschmiert.<br />
(Dass der *Allokator-Typ* gleicht ist, ist natürlich schon allein dadurch garantiert, dass Container mit unterchiedlichen Allokator-Typen, schon komplett unterschiedliche (und unverwandte) Klassen sind, also vec.swap(other) gar nie aufgerufen werden kann, wenn other einen unterschiedlichen Allokator-Typ verwendet)</p>
<p>In anderen swap Funktionen, sowie den &quot;splice&quot;, &quot;merge&quot;, ... Funktion von &quot;std::list&quot; findet man ähnliche Konstrukte.</p>
<p>Aber mal ganz davon abgesehen dass es vermutlich keine bessere Lösung gibt, als die Elemente in swap() in diesem &quot;Spezialfall&quot; zu kopieren... führt mich das ganze zur Annahme, dass die Standard Library sehrwohl garantiert, dass Objekte mit &quot;dem selben&quot; (=einem kompatiblen) Allokator freigegeben werden, über den sie auch angefordert wurden.</p>
<p>----</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Dann müsste man also in jedem Speicherblock zum Beispiel sizeof(void*) zusätzliche Bytes speichern, welche dann einen Zeiger zum korrekten Pool beinhalten?</p>
</blockquote>
<p>Das wäre vermutlich ein gangbarer Weg.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Also auf das, was im Allokator gespeichert ist, darf man überhaupt nicht gehen?</p>
</blockquote>
<p>Wenn du maximale Portierbarkeit/Kompatibilität mit vielen Implementierungen haben willst, dann sicher nicht. Sonst u.U. schon. Wobei ich mich mit dieser Einschätzung durchaus irren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720056</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 03 Jun 2009 01:19:30 GMT</pubDate></item></channel></rss>