<?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[Design von boost::ptr_map]]></title><description><![CDATA[<p>Vor kurzem habe ich mich mit <code>boost::ptr_map</code> auseinandergesetzt und teilweise schon recht gewundert. Unter anderem über Folgendes (Ausschnitt aus der Referenz über <code>ptr_map_adapter</code> ):</p>
<pre><code class="language-cpp">public: // modifiers         
        std::pair&lt;iterator,bool&gt;  insert( key_type&amp; k, T* x );                         
        template&lt; class U &gt;
        std::pair&lt;iterator,bool&gt;  insert( const key_type&amp; k, std::auto_ptr&lt;U&gt; x );
</code></pre>
<p>Warum wurde die Schnittstelle gegenüber <code>std::map</code> derart verändert? Und was soll die Referenz auf <code>key_type&amp;</code> bei der ersten <code>insert()</code> -Überladung? Gibt es einen Grund, dass man keine temporären Objekte als Schlüssel übergeben darf?</p>
<p>Auch Debugging wird zur Hölle, da man etwa sieben Indirektionen hat, bis man nur zum Pair kommt und dann merkt, dass man gar nicht auf den <code>second</code> -Teil zugreifen kann, weil dort ein <code>void*</code> verwendet wurde. Sehr sauber, von Boost hätte ich mehr erwartet. Und weshalb existiert eigentlich die Indirektion über <code>boost::ptr_map_adapter</code> ?</p>
<p>Ich finde es ja nett, dass Boost jede Klasse unter massivem Einsatz von Templates, Hilfsklassen und Adaptoren gestaltet, aber manchmal nervt es echt. Ich hätte es zum Beispiel schön gefunden, wenn <code>boost::ptr_map</code> ähnlich wie <code>std::map</code> <em>einfach</em> aufgebaut wäre. Mindestens soweit möglich ähnliches Interface und eindeutiger <code>value_type</code> . Nein, es muss implementation-defined (bei mir <code>ref_pair</code> ) sein, natürlich mit eigener Semantik. Naja...</p>
<p>Was meint ihr dazu?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242495/design-von-boost-ptr_map</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 09:10:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242495.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Jun 2009 14:07:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Design von boost::ptr_map on Thu, 04 Jun 2009 14:07:25 GMT]]></title><description><![CDATA[<p>Vor kurzem habe ich mich mit <code>boost::ptr_map</code> auseinandergesetzt und teilweise schon recht gewundert. Unter anderem über Folgendes (Ausschnitt aus der Referenz über <code>ptr_map_adapter</code> ):</p>
<pre><code class="language-cpp">public: // modifiers         
        std::pair&lt;iterator,bool&gt;  insert( key_type&amp; k, T* x );                         
        template&lt; class U &gt;
        std::pair&lt;iterator,bool&gt;  insert( const key_type&amp; k, std::auto_ptr&lt;U&gt; x );
</code></pre>
<p>Warum wurde die Schnittstelle gegenüber <code>std::map</code> derart verändert? Und was soll die Referenz auf <code>key_type&amp;</code> bei der ersten <code>insert()</code> -Überladung? Gibt es einen Grund, dass man keine temporären Objekte als Schlüssel übergeben darf?</p>
<p>Auch Debugging wird zur Hölle, da man etwa sieben Indirektionen hat, bis man nur zum Pair kommt und dann merkt, dass man gar nicht auf den <code>second</code> -Teil zugreifen kann, weil dort ein <code>void*</code> verwendet wurde. Sehr sauber, von Boost hätte ich mehr erwartet. Und weshalb existiert eigentlich die Indirektion über <code>boost::ptr_map_adapter</code> ?</p>
<p>Ich finde es ja nett, dass Boost jede Klasse unter massivem Einsatz von Templates, Hilfsklassen und Adaptoren gestaltet, aber manchmal nervt es echt. Ich hätte es zum Beispiel schön gefunden, wenn <code>boost::ptr_map</code> ähnlich wie <code>std::map</code> <em>einfach</em> aufgebaut wäre. Mindestens soweit möglich ähnliches Interface und eindeutiger <code>value_type</code> . Nein, es muss implementation-defined (bei mir <code>ref_pair</code> ) sein, natürlich mit eigener Semantik. Naja...</p>
<p>Was meint ihr dazu?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721099</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 04 Jun 2009 14:07:25 GMT</pubDate></item><item><title><![CDATA[Reply to Design von boost::ptr_map on Thu, 04 Jun 2009 14:59:51 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Warum wurde die Schnittstelle gegenüber <code>std::map</code> derart verändert? Und was soll die Referenz auf <code>key_type&amp;</code> bei der ersten <code>insert()</code> -Überladung? Gibt es einen Grund, dass man keine temporären Objekte als Schlüssel übergeben darf?</p>
</blockquote>
<p><a href="http://www.boost.org/doc/libs/1_39_0/libs/ptr_container/doc/faq.html#why-does-ptr-map-t-insert-replace-take-two-arguments-the-key-and-the-pointer-instead-of-one-std-pair-and-why-is-the-key-passed-by-non-const-reference" rel="nofollow">FAQ</a></p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Auch Debugging wird zur Hölle, da man etwa sieben Indirektionen hat, bis man nur zum Pair kommt und dann merkt, dass man gar nicht auf den <code>second</code> -Teil zugreifen kann, weil dort ein <code>void*</code> verwendet wurde. Sehr sauber, von Boost hätte ich mehr erwartet.</p>
</blockquote>
<p><a href="http://www.boost.org/doc/libs/1_39_0/libs/ptr_container/doc/ptr_container.html#future-developments" rel="nofollow">Future Developments</a></p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Und weshalb existiert eigentlich die Indirektion über <code>boost::ptr_map_adapter</code> ?</p>
</blockquote>
<p>Soweit mir bekannt ist, damit man auf einfache Art und Weise eigene Implementationen realisieren kann. Also ist quasi ein Hilfsmittel.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Was meint ihr dazu?</p>
</blockquote>
<p>Ich bin durchaus der Meinung, dass man gewisse Dinge einfacher hätte machen können. Vor allem das mit dem <code>void*</code> ist mir irgendwie schleierhaft.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721156</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 04 Jun 2009 14:59:51 GMT</pubDate></item><item><title><![CDATA[Reply to Design von boost::ptr_map on Thu, 04 Jun 2009 15:56:41 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p><a href="http://www.boost.org/doc/libs/1_39_0/libs/ptr_container/doc/faq.html#why-does-ptr-map-t-insert-replace-take-two-arguments-the-key-and-the-pointer-instead-of-one-std-pair-and-why-is-the-key-passed-by-non-const-reference" rel="nofollow">FAQ</a></p>
</blockquote>
<p>Danke. Naja, man muss ja alle Fälle abdecken, und Exceptionsicherheit ist einer der wichtigen Punkte bei Pointer-Containern. Dadurch hat man aber teilweise hässlichen Code, weil man jedes kleine Objekt erst deklarieren muss. Für gewisse Variablen muss man sogar <code>const_cast</code> einsetzen, weil eine Non-Const-Referenz erwartet wird. Wieso haben sie nicht gleich <code>const key*</code> genommen? Da würde auch kein Kopierkonstruktor aufgerufen...</p>
<p>Dravere schrieb:</p>
<blockquote>
<p><a href="http://www.boost.org/doc/libs/1_39_0/libs/ptr_container/doc/ptr_container.html#future-developments" rel="nofollow">Future Developments</a><br />
[...]<br />
Vor allem das mit dem <code>void*</code> ist mir irgendwie schleierhaft.</p>
</blockquote>
<p>Wirklich. Das Statement ist lustig:</p>
<p>Thorsten Ottosen (Boost-Mensch) schrieb:</p>
<blockquote>
<p>There are indications that the void* implementation has a slight performance overhead compared to a T* based implementation. Furthermore, a T* based implementation is so much easier to use type-safely with algorithms. Therefore I anticipate to move to a T* based implementation.</p>
</blockquote>
<p>Warum haben sie es nicht schon längst so gemacht? Sieht nicht so aus, als hätte T* Nachteile...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721188</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 04 Jun 2009 15:56:41 GMT</pubDate></item><item><title><![CDATA[Reply to Design von boost::ptr_map on Thu, 04 Jun 2009 21:33:02 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>...</p>
<p>Was meint ihr dazu?</p>
</blockquote>
<p>Ich hatte die Doku kurz überflogen - fand es ganz interessant, aber konnte der Bibliothek keinen praktischen Nährwert abgewinnen.<br />
Wenn ich schon Pointer in Container packe, dann immer als Smart-Pointer (bei Containern dann natürlich shared_ptr). Oder ich implementiere Klassen mit schwer kopierbarem Inhalt nach dem Bridge-Pattern (heißt das so?) - also die Daten werden auf dem Heap angelegt und die Klasse selbst hält nur genau einen Pointer darauf.</p>
<p>Das hat in beiden Fällen den Vorteil, dass ich die Objekte auch außerhalb des Containers halten kann, ohne mir Sorgen um irgendwelche Memory- und sonstige Leaks zu machen.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721445</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 04 Jun 2009 21:33:02 GMT</pubDate></item><item><title><![CDATA[Reply to Design von boost::ptr_map on Fri, 05 Jun 2009 06:24:24 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Wenn ich schon Pointer in Container packe, dann immer als Smart-Pointer (bei Containern dann natürlich shared_ptr).</p>
</blockquote>
<p>shared_ptr ist aber der teuerste Smartpointer (Performance...), so das - sofern nur an einer Stelle die Verwaltung erfolgt, die ptr-Container schon ihren Sinn haben. shared_ptr sind wiederum dann recht gut, wenn man das Objekt an mehreren Stellen hält, und nicht garantieren kann, welche Stelle nun die Speicherverwaltung übernimmt.</p>
<p>Wobei ich auch lieber einheitlich programmiere, und dann eher zum shared_ptr greife (sofern es sich nicht als Flaschenhals erweist).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721519</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 05 Jun 2009 06:24:24 GMT</pubDate></item><item><title><![CDATA[Reply to Design von boost::ptr_map on Fri, 05 Jun 2009 07:53:13 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Wenn ich schon Pointer in Container packe, dann immer als Smart-Pointer (bei Containern dann natürlich shared_ptr).</p>
</blockquote>
<p>So lange haben wir gekämpft dass smart pointer statt rohen zeiger verwendet werden und dann packen die leute überall nur noch shared_ptr hin anstatt nachzudenken. es ist furchtbar. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721558</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 05 Jun 2009 07:53:13 GMT</pubDate></item><item><title><![CDATA[Reply to Design von boost::ptr_map on Fri, 05 Jun 2009 08:19:36 GMT]]></title><description><![CDATA[<p>Man sollte auch dazu sagen, das sich ptr_container und shared_ptr/boost::smart_ptr nicht unbedingt vertragen.</p>
<p>Weil z.b. man aus einem ptr_container den ptr wieder hinaus bekommt, aber wenn man ihn dann in einen shared_ptr tut, ist der &quot;Rückweg&quot; versperrt, ausser man nutzt clone oder ähnliche Kopiertechniken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721566</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Fri, 05 Jun 2009 08:19:36 GMT</pubDate></item><item><title><![CDATA[Reply to Design von boost::ptr_map on Fri, 05 Jun 2009 10:25:42 GMT]]></title><description><![CDATA[<p>phlox81 schrieb:</p>
<blockquote>
<p>Man sollte auch dazu sagen, das sich ptr_container und shared_ptr/boost::smart_ptr nicht unbedingt vertragen.</p>
</blockquote>
<p>Was nie ein Problem darstellt.</p>
<p>Denn entweder hat die map ownership der Zeiger, dann brauche ich keine shared_ptr oder aber die map hat keinen owner ship, dann brauche ich keine ptr_container sondern nehme normale...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721658</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 05 Jun 2009 10:25:42 GMT</pubDate></item><item><title><![CDATA[Reply to Design von boost::ptr_map on Fri, 05 Jun 2009 10:51:39 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>So lange haben wir gekämpft dass smart pointer statt rohen zeiger verwendet werden und dann packen die leute überall nur noch shared_ptr hin anstatt nachzudenken. es ist furchtbar. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Hey, ich habe immerhin die Mühe auf mich genommen, mich in <code>ptr_map</code> einzulesen und mich an die spezielle Schnittstelle zu gewöhnen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ich benutze auch schon länger andere Pointer-Container, zum Beispiel <code>ptr_vector</code> . <code>shared_ptr</code> brauch ich in Containern eigentlich nur, wenn ich Ownership teile oder Elemente von einem in einen anderen Container verschieben will, was bis jetzt allerdings nicht oft vorkam.</p>
<p>Noch eine Frage: Wenn ich mit <code>BOOST_FOREACH</code> eine <code>ptr_map</code> durchiterieren will, kann ich ja Folgendes tun:</p>
<pre><code class="language-cpp">typedef boost::ptr_map&lt;int, std::string&gt; NumberMap;

NumberMap Map;
int a = 4;	// jaja...
int b = 7;
int c = 0;
Map.insert(a, new std::string(&quot;vier&quot;));
Map.insert(b, new std::string(&quot;sieben&quot;));
Map.insert(c, new std::string(&quot;null&quot;));

BOOST_FOREACH(NumberMap::value_type v, Map)
{
	std::cout &lt;&lt; v.first &lt;&lt; &quot; -&gt; &quot; &lt;&lt; *v.second &lt;&lt; std::endl;
}
</code></pre>
<p>Warum erhalte ich eine Warnung wegen Referenzen auf temporäre Objekte, wenn ich <code>NumberMap::value_type&amp;</code> schreibe? Bei anderen <code>BOOST_FOREACH</code> -Konstrukten ist doch das auch möglich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721678</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 05 Jun 2009 10:51:39 GMT</pubDate></item><item><title><![CDATA[Reply to Design von boost::ptr_map on Fri, 05 Jun 2009 13:02:24 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Wenn ich schon Pointer in Container packe, dann immer als Smart-Pointer (bei Containern dann natürlich shared_ptr).</p>
</blockquote>
<p>So lange haben wir gekämpft dass smart pointer statt rohen zeiger verwendet werden und dann packen die leute überall nur noch shared_ptr hin anstatt nachzudenken. es ist furchtbar. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Ja - und es hat gar nicht weh getan <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Und trotz shared_ptr haben wir auch das Nachdenken nicht aufgegeben! Es hat sich aber auf ein Abstraktionsstufe höher verlegt - so zwischen zyklischen und wandernden Ownerships mit weak_ptr und enable_from_this. Wie das mit rohen Zeigern hinzubekommen ist ... naja vielleicht weiß volkard das?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721753</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 05 Jun 2009 13:02:24 GMT</pubDate></item><item><title><![CDATA[Reply to Design von boost::ptr_map on Fri, 05 Jun 2009 13:10:13 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>phlox81 schrieb:</p>
<blockquote>
<p>Man sollte auch dazu sagen, das sich ptr_container und shared_ptr/boost::smart_ptr nicht unbedingt vertragen.</p>
</blockquote>
<p>Was nie ein Problem darstellt.</p>
<p>Denn entweder hat die map ownership der Zeiger, dann brauche ich keine shared_ptr oder aber die map hat keinen owner ship, dann brauche ich keine ptr_container sondern nehme normale...</p>
</blockquote>
<p>Hm, doch doch. Immer dann wenn du unter umständen den Pointer wieder aus der map entfernen willst, ohne ihn zu löschen. Wobei das natürlich dann wiederum so sein kann das man ihn in einen weiteren ptr_container tut.<br />
Wollte mal für ein undo/redo einen boost::circular_buffer&lt;shared_ptr&lt;T&gt; &gt; machen, das verträgt sich aber nicht, wenn man den aus einem/meheren ptr_containern füttert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721758</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Fri, 05 Jun 2009 13:10:13 GMT</pubDate></item><item><title><![CDATA[Reply to Design von boost::ptr_map on Sun, 07 Jun 2009 14:39:04 GMT]]></title><description><![CDATA[<p>Hm... Weiss jemand, wo man bei dem Code</p>
<pre><code class="language-cpp">BOOST_FOREACH(NumberMap::value_type&amp; v, Map) // hier mit Referenz
{ 
    std::cout &lt;&lt; v.first &lt;&lt; &quot; -&gt; &quot; &lt;&lt; *v.second &lt;&lt; std::endl; 
}
</code></pre>
<p>eine Non-Const-Referenz an ein temporäres Objekt bindet? Wenn man <code>BOOST_FOREACH</code> sonst einsetzt, funktioniert das doch auch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722767</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Jun 2009 14:39:04 GMT</pubDate></item><item><title><![CDATA[Reply to Design von boost::ptr_map on Tue, 09 Jun 2009 13:54:17 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>,<br />
Falls das Problem noch besteht, dann ist hier die Lösung oder die Problembeschreibung:<br />
Beim Dereferenzieren des Iterators wird ein <code>boost::ptr_container_detail::ref_pair</code> zuückgegeben und zwar ein Objekt und nicht eine Referenz. Dies führt dann natürlich zum Fehler.<br />
Du kannst aber hier ohne Probleme eine Kopie durchführen. Dieses <code>ref_pair</code> ist intern eine konstante Referenz auf den Schlüssel und der Zeiger auf das Objekt. Dieses <code>ref_pair</code> Objekt ist somit äusserst klein.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/642">@phlox81</a>,<br />
Das ist aber weniger das Problem von dem <code>ptr_container</code> , sondern eher das Problem vom <code>shared_ptr</code> . Der <code>shared_ptr</code> hat nämlich keine Möglichkeit den Zeiger freizugeben, also sowas wie ein <code>release</code> durchzuführen. Wieso sowas nicht vorhanden ist, steht hier:<br />
<a href="http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/shared_ptr.htm#FAQ" rel="nofollow">http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/shared_ptr.htm#FAQ</a><br />
(Zweitletzte Frage/Antwort)</p>
<p>Grüssli</p>
<p>PS: Hat einer von euch schon mal angeschaut, was der Präprozessor aus <code>BOOST_FOREACH</code> macht? Komplizierter geht es wohl kaum noch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723877</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 09 Jun 2009 13:54:17 GMT</pubDate></item><item><title><![CDATA[Reply to Design von boost::ptr_map on Tue, 09 Jun 2009 14:54:16 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Antwort, Dravere! Das macht natürlich Sinn. Ich hatte es auch mit <code>value_type</code> -Kopien gelöst, es hat mich nur interessiert, weshalb hier eine Warnung entsteht.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>PS: Hat einer von euch schon mal angeschaut, was der Präprozessor aus <code>BOOST_FOREACH</code> macht? Komplizierter geht es wohl kaum noch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Mir hat es eigentlich gereicht, dass bei Drüberfahren mit der Maus ein recht grosser und unübersichtlicher Block mit der Makrodefinition kam. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Bei Boost schreiben sie:</p>
<blockquote>
<p>BOOST_FOREACH is designed for ease-of-use and efficiency. It [...] makes no calls that are not transparent to the compiler's optimizer. This results in near-optimal code generation; the performance of BOOST_FOREACH is usually within a few percent of the equivalent hand-coded loop.</p>
</blockquote>
<p>1. Beim Profilen mit AMD CodeAnalyst habe ich zumindest noch einige Funktionsaufrufe für <code>BOOST_FOREACH</code> entdecken können (auch wenn diese im Verhältnis zum Programm kaum Zeit benötigen), also ganz wegoptimierbar scheint es mir nicht zu sein. Ich hab allerdings auch nicht allzu lange herumprobiert, einfach mit der Standard-Release-Einstellung bei MSVC++.<br />
2. Einige wenige Prozent? Das klingt für mich ehrlich gesagt nicht wie nichts. Klar, in vielen Fällen kommt es nicht drauf an, aber bei performancekritischen Anwendungen wäre ich da eher skeptisch. Aber in der Praxis kann es natürlich wieder ganz anders aussehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723915</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 09 Jun 2009 14:54:16 GMT</pubDate></item></channel></rss>