<?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[Member-Iterator auf eigene Klasse]]></title><description><![CDATA[<p>Ist sowas laut C++-Standard erlaubt?</p>
<pre><code class="language-cpp">#include &lt;list&gt;

struct Triangle
{
	std::list&lt;Triangle&gt;::iterator i;
};
</code></pre>
<p>Ich hätte nein gesagt, da STL-Container vollständige Typen verlangen, was zum Zeitpunkt der Iterator-Deklaration nicht gegeben ist. Allerdings scheinen VC++, g++, Comeau und Clang den Code zu kompilieren.</p>
<p>Hintergrund ist ein Algorithmus, wo ein Dreieck Iteratoren auf seine Nachbarn speichert. Ich verwende hier Iteratoren und nicht Zeiger, damit der Algorithmus bei Bedarf die Dreiecke direkt aus der Liste entfernen kann, ohne suchen zu müssen. Falls der Code nicht standardkonform ist, wie würdet ihr das lösen? Auf Pimpl würde ich gerne verzichten.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307742/member-iterator-auf-eigene-klasse</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 11:24:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307742.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Sep 2012 10:45:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Tue, 04 Sep 2012 10:45:29 GMT]]></title><description><![CDATA[<p>Ist sowas laut C++-Standard erlaubt?</p>
<pre><code class="language-cpp">#include &lt;list&gt;

struct Triangle
{
	std::list&lt;Triangle&gt;::iterator i;
};
</code></pre>
<p>Ich hätte nein gesagt, da STL-Container vollständige Typen verlangen, was zum Zeitpunkt der Iterator-Deklaration nicht gegeben ist. Allerdings scheinen VC++, g++, Comeau und Clang den Code zu kompilieren.</p>
<p>Hintergrund ist ein Algorithmus, wo ein Dreieck Iteratoren auf seine Nachbarn speichert. Ich verwende hier Iteratoren und nicht Zeiger, damit der Algorithmus bei Bedarf die Dreiecke direkt aus der Liste entfernen kann, ohne suchen zu müssen. Falls der Code nicht standardkonform ist, wie würdet ihr das lösen? Auf Pimpl würde ich gerne verzichten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248352</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 04 Sep 2012 10:45:29 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Tue, 04 Sep 2012 10:57:38 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ich verwende hier Iteratoren und nicht Zeiger, damit der Algorithmus bei Bedarf die Dreiecke direkt aus der Liste entfernen kann, ohne suchen zu müssen. Falls der Code nicht standardkonform ist, wie würdet ihr das lösen?</p>
</blockquote>
<p>Eine Intrusive-List ala Boost.Intrusive verwenden.<br />
Dann kannst du wieder Zeiger speichern, da du jederzeit mit O(1) einen Zeiger in einen Iterator verwandeln kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248361</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 04 Sep 2012 10:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Tue, 04 Sep 2012 11:07:53 GMT]]></title><description><![CDATA[<p>ich denke mal, dass du dir die Sache mit der list gut überlegt hast, sonst hätte ich dir boost::graph vorgeschlagen. Eventuell ist dein Algorithmus, oder Teile davon bereits implementiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248367</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 04 Sep 2012 11:07:53 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Tue, 04 Sep 2012 11:31:31 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Eine Intrusive-List ala Boost.Intrusive verwenden.<br />
Dann kannst du wieder Zeiger speichern, da du jederzeit mit O(1) einen Zeiger in einen Iterator verwandeln kannst.</p>
</blockquote>
<p>Ich wollte hier zwar kein Boost verwenden, aber das schaue ich mir auf jeden Fall mal an. Merci!</p>
<p>otze schrieb:</p>
<blockquote>
<p>sonst hätte ich dir boost::graph vorgeschlagen</p>
</blockquote>
<p>Danke, aber von Boost.Graph und seinem impliziten, über-abstrahierten und mies dokumentierten API habe ich vorerst genug. Mit <a href="https://lemon.cs.elte.hu/trac/lemon" rel="nofollow">LEMON</a> habe ich persönlich bessere Erfahrungen gemacht. Ist zwar nicht endlos generisch, bietet dafür vernünftige Schnittstellen an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248378</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 04 Sep 2012 11:31:31 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Tue, 04 Sep 2012 16:05:28 GMT]]></title><description><![CDATA[<p>Naja notfalls ist ne doppelt verkettete Liste auch schnell selbst implementiert <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2248471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248471</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 04 Sep 2012 16:05:28 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Tue, 04 Sep 2012 21:18:17 GMT]]></title><description><![CDATA[<p>Bisher bräuchte ich nur die Methoden <code>push_back()</code> , <code>begin()</code> , <code>end()</code> , <code>erase()</code> , <code>remove_if()</code> , <code>empty()</code> . Würde vielleicht sogar eine einfach verkettete Liste reichen.</p>
<p>Mühsam ist jedoch Speicherverwaltung. Bei Boosts Intrusive-Containern wird das ja extern geregelt, aber wie wird das in der Praxis gehandhabt? Läuft das nicht darauf hinaus, die Elemente in einem weiteren, besitzenden Container/Pool zu speichern?</p>
<p>Ist ein bisschen schade, dass so ein kleines &quot;Problem&quot; (d.h. auf den meisten Compilern ein Nicht-Problem) zu so viel Refactoring führt. Ich bin versucht, die zirkuläre Abhängigkeit einfach mit einer Indirektion (gewrappter Iterator) zu durchbrechen, aber ich fürchte, pro Iteratorkopie eine dynamische Speicheranforderung wird schnell teuer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248520</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 04 Sep 2012 21:18:17 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Tue, 04 Sep 2012 21:54:40 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ist ein bisschen schade, dass so ein kleines &quot;Problem&quot; (d.h. auf den meisten Compilern ein Nicht-Problem) zu so viel Refactoring führt</p>
</blockquote>
<p>Ist denn wirklich schon geklärt, ob das Pattern UB oder ähnliches ist?</p>
<p>Beim CRTP ist's doch auch nicht anders...</p>
<p>Ich meine auch, vor kurzem hier schon einmal über diese Diskussion gestolpert zu sein...Ich hab das nicht weiter verfolgt, weil das einen &quot;Standard-Lawyer&quot; verlangt und meine Kompetenzen übersteigt.<br />
Aber vielleicht solltest Du jemanden finden, der in den Ring steigt und sagt<br />
&quot;Das geht nicht, weil ABC&quot;. Bzw. &quot;Das geht, weil XYZ&quot; und anhand der Argumente in der folgenden Diskussion entscheiden, ob das Refactoring wirklich nötig ist...</p>
<p>Grüßle.<br />
FW</p>
<p>PS: Ich denke es ist okay - eben wie beim CRTP.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248522</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Tue, 04 Sep 2012 21:54:40 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Tue, 04 Sep 2012 22:28:04 GMT]]></title><description><![CDATA[<p>Jemand hatte auf Mac OS X mit Clang 4.0 Probleme mit ähnlichem Code. Wenn ich die Fehlermeldung richtig interpretiere, weil der Typ im STL-Container nicht vollständig war. Clang 3.0 (die <a href="http://llvm.org/demo/index.cgi" rel="nofollow">Online-Version</a>, mit der ich getestet habe) kompiliert den Beispielcode dieses Threads problemlos, ebenso die drei anderen Compiler. Aber ich frage nochmals nach, wie es mit Clang 4 und diesem Beispielcode aussieht.</p>
<p>Ich habe nur den Final Draft des C++11-Standards, dieser besagt:</p>
<p>C++ FDIS 2011 (n3290), §17.6.4.8/2 schrieb:</p>
<blockquote>
<p>In particular, the effects are undefined [...] if an incomplete type (3.9) is used as a template argument when instantiating a template component, unless specifically allowed for that component.</p>
</blockquote>
<p>Jetzt weiss ich nicht, ob das noch aktuell ist und ob es nicht irgendwo eine Klausel gibt, durch die der Fall &quot;specifically allowed&quot; wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248524</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 04 Sep 2012 22:28:04 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Tue, 04 Sep 2012 22:55:49 GMT]]></title><description><![CDATA[<p>Clang 4 gibts doch noch gar nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248527</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Tue, 04 Sep 2012 22:55:49 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Tue, 04 Sep 2012 23:34:10 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ich habe nur den Final Draft des C++11-Standards, dieser besagt:</p>
<p>C++ FDIS 2011 (n3290), §17.6.4.8/2 schrieb:</p>
<blockquote>
<p>In particular, the effects are undefined [...] if an incomplete type (3.9) is used as a template argument when instantiating a template component, unless specifically allowed for that component.</p>
</blockquote>
<p>Jetzt weiss ich nicht, ob das noch aktuell ist und ob es nicht irgendwo eine Klausel gibt, durch die der Fall &quot;specifically allowed&quot; wird.</p>
</blockquote>
<p>Zieh dir den n3337. Der ist bis auf ein paar Fehlerkorrekturen mit dem Standard identisch.<br />
n3337:<br />
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf</a><br />
Änderungen gegenüber dem Standard:<br />
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3338.html" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3338.html</a></p>
<p>Davon abgesehen...<br />
Das heisst ja bloss &quot;manche Template-Klassen brauchen Argumente die vollständig sind ey, also passt da mal auf&quot;. Wenn bei std::list nicht dabeisteht dass sie auch mit unvollständigen Klassen funktionieren muss, dann muss sie halt nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248531</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 04 Sep 2012 23:34:10 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Tue, 04 Sep 2012 23:54:13 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Clang 4 gibts doch noch gar nicht.</p>
</blockquote>
<p>Du hast Recht, Apple scheint da anders zu zählen. <code>clang -v</code> auf Mac gab Folgendes aus, also eine Abwandlung von 3.1:</p>
<pre><code>Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
</code></pre>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Zieh dir den n3337. Der ist bis auf ein paar Fehlerkorrekturen mit dem Standard identisch.</p>
</blockquote>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248533</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 04 Sep 2012 23:54:13 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Wed, 05 Sep 2012 09:23:01 GMT]]></title><description><![CDATA[<p>Interessant ist auch, Comeau Online kompiliert den folgenden Code nicht:</p>
<pre><code class="language-cpp">#include &lt;list&gt;

struct Triangle;
typedef std::list&lt;Triangle&gt;::iterator Iterator;

struct Triangle
{
    Iterator i;
};

int main() {}
</code></pre>
<p>Nimmt man das <code>typedef</code> in die Klasse, kompiliert der Code. Gilt die Klasse innerhalb ihrer Definition etwa schon als vollständiger Typ? Z.B. Grösse ist dann noch nicht bekannt.</p>
<p>Und vielleicht doch nochmal zu den Intrusive-Containern: Wie handhabt ihr die Speicherverwaltung der einzelnen Elemente?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248596</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 05 Sep 2012 09:23:01 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Wed, 05 Sep 2012 09:51:12 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Gilt die Klasse innerhalb ihrer Definition etwa schon als vollständiger Typ?</p>
</blockquote>
<p>n3337 schrieb:</p>
<blockquote>
<p>9.2/2 A class is considered a completely-defined object type (3.9) (or complete type) at the closing } of the<br />
class-specifier. Within the class member-specification, the class is regarded as complete within function<br />
bodies, default arguments, exception-specifications, and brace-or-equal-initializers for non-static data members<br />
(including such things in nested classes). Otherwise it is regarded as incomplete within its own class<br />
member-specification.</p>
</blockquote>
<p>Also nein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248633</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 05 Sep 2012 09:51:12 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Wed, 05 Sep 2012 11:12:23 GMT]]></title><description><![CDATA[<p>Es kann sein, dass das durchaus implementationsabhängig ist, ob das funktioniert.<br />
Wenn der Iterator wie folgt implementiert ist:</p>
<pre><code class="language-cpp">template&lt;class ListElement&gt;
class ListIterator{
    ListElement* element;
public:
   //...
};
</code></pre>
<p>Dann muss ListElement zu dem Zeitpunkt nicht vollständig sein. Für die Methoden des Iterators gilt dann wahrscheinlich die zitierte Klausel aus dem Standard:<br />
&quot;Within the class member-specification, the class is regarded as complete within function<br />
bodies, default arguments, exception-specifications, and brace-or-equal-initializers for non-static data members&quot; also würde es in diesem Fall gar kein Problem geben.</p>
<p>Ich weiß aber nicht, wie es in diesem Fall sein würde:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class list{
    struct ListElement{
        T element;//hier muss T vollständig sein, oder?
    };
    class iterator{
        ListElement* element;
    public:
       //...
    };
};
</code></pre>
<p>Muss ListElement erzeugt werden, wenn list&lt;T&gt;::iterator aufgerufen wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248654</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 05 Sep 2012 11:12:23 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Wed, 05 Sep 2012 12:05:04 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Ich weiß aber nicht, wie es in diesem Fall sein würde:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class list{
    struct ListElement{
        T element;//hier muss T vollständig sein, oder?
    };
    class iterator{
        ListElement* element;
    public:
       //...
    };
};
</code></pre>
<p>Muss ListElement erzeugt werden, wenn list&lt;T&gt;::iterator aufgerufen wird?</p>
</blockquote>
<p>Jedenfalls nicht, wenn der //...-Teil es nicht erfordert.</p>
<p>Es könnte auch so aussehen:</p>
<pre><code class="language-cpp">template &lt;typename T, typename A, bool trivial&gt;
class list_base;

template &lt;typename T, typename A&gt;
class list_base&lt;T,A,true&gt;; // mit cleveren Optimierungen

template &lt;typename T, typename A&gt;
class list : list_base&lt;T, A, is_trivial&lt;T&gt;::value&gt;
{
...
};
</code></pre>
<p>Und schon klappt es gar nicht mehr mit unvollständigen Typen, unabhängig davon, weshalb das list-Template nun instantiiert wurde (man kann das auch gleich mit dem Default-Allokator so machen; dann wird auch klar, wieso nur wenige Klassentemplates solche expliziten Ausnahmen haben).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248679</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 05 Sep 2012 12:05:04 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Wed, 05 Sep 2012 12:12:11 GMT]]></title><description><![CDATA[<p>Klar kann es implementierungsabhängig sein.</p>
<p>Bzw... was den Allokator angeht weiss ich nicht. Müsste auch gehen, hab ich mir nicht so genau überlegt. Aber wenn wir mal annehmen dass der Allokator kein Problem macht...</p>
<p>Es sollte möglich sein <code>std::list&lt;T&gt;</code> so zu implementieren dass eine vollständige Definition von T überhaupt nicht nötig ist bis diverse Memberfunktionen instanziert werden die notwendigerweise eine vollständige Definition von T brauchen (wie z.B. push_back, weil da ja kopiert wird).</p>
<p>Wenn man unnötigen Overhead in Kauf nimmt ist es sogar sehr leicht: man schiebt eine Zwischenklasse für die Nodes ein die T nicht als Member enthält, dafür entweder eine virtual pure &quot;get&quot; Funktion hat die eine Referenz auf T zurückgibt, oder einen T* enthält.</p>
<p>Ganz ohne unnötigen Overhead wird es u.U. schwierig, bzw. evtl. sogar unmöglich. Um den Offset des T innerhalb der Node zu ermitteln braucht man das Alignment von T, und das ist erst bekannt wenn T vollständig ist. Man müsste also irgendwie über Umwege an den Offset bzw. den T* kommen. Und Umweg = normalerweise Overhead.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248684</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 05 Sep 2012 12:12:11 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Wed, 05 Sep 2012 12:37:27 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Klar kann es implementierungsabhängig sein.</p>
<p>Bzw... was den Allokator angeht weiss ich nicht. Müsste auch gehen, hab ich mir nicht so genau überlegt. Aber wenn wir mal annehmen dass der Allokator kein Problem macht...</p>
<p>Es sollte möglich sein <code>std::list&lt;T&gt;</code> so zu implementieren dass eine vollständige Definition von T überhaupt nicht nötig ist bis diverse Memberfunktionen instanziert werden die notwendigerweise eine vollständige Definition von T brauchen (wie z.B. push_back, weil da ja kopiert wird).</p>
<p>Wenn man unnötigen Overhead in Kauf nimmt ist es sogar sehr leicht: man schiebt eine Zwischenklasse für die Nodes ein die T nicht als Member enthält, dafür entweder eine virtual pure &quot;get&quot; Funktion hat die eine Referenz auf T zurückgibt, oder einen T* enthält.</p>
<p>Ganz ohne unnötigen Overhead wird es u.U. schwierig, bzw. evtl. sogar unmöglich. Um den Offset des T innerhalb der Node zu ermitteln braucht man das Alignment von T, und das ist erst bekannt wenn T vollständig ist. Man müsste also irgendwie über Umwege an den Offset bzw. den T* kommen. Und Umweg = normalerweise Overhead.</p>
</blockquote>
<p>Ich denke bei list dürfte es möglich sein (sofern der Allokator vollständig ist), ohne Overhead unvollständige Typen zuzulassen.<br />
Das wäre, denke ich, tatsächlich ein Vorschlag für eine nützliche Erweiterung wert, wenn sich mal jemand die Mühe macht, zu demonstrieren, welche Container und ggf. Iteratoren ohne Overhead (also auch ohne Ausschluss denkbarer Optimierungen) mit unvollständigem Valuetyp auskommmen könnten. Der Defaultallokator dürfte eigentlich auch recht unproblematisch sein, der ist ja sowieso austauschbar, kann also stateless implementiert werden.</p>
<p>Kein richtiger Container kann die Smallobjekt-Optimierung durchführen, weil Iteratoren bei swap stabil bleiben müssen. Alles andere was so einfällt, dürfte eigentlich kein Hindernis darstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248694</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 05 Sep 2012 12:37:27 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Wed, 05 Sep 2012 16:30:07 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a><br />
Du meinst jetzt nur die Instanzierung der Container-Klasse selbst...? Oder auch die Instanzierung von Memberfunktionen die T gar nicht wirklich verwenden sondern nur Zeiger/Referenzen darauf rumreichen?</p>
<p>Bei der Instanzierung von Memberfunktionen wie <code>list&lt;T&gt;::back</code> bzw. <code>list&lt;T&gt;::iterator::operator *</code> sehe ich nämlich ein kleines Problem, und zwar wie man ohne Overhead aus einem Node-Zeiger einen T-Zeiger macht (oder umgekehrt).</p>
<p>Oder hättest du diesbezüglich irgendeine Idee?</p>
<p>Irgendwie fällt mir keine wirklich gute Lösung ein.</p>
<p>Das beste was mir bisher eingefallen ist wäre überall nur T-Zeiger abzuspeichern (oder auch gleich char-Zeiger die auf ein T zeigen), und dann mit <code>static_cast&lt;Node*&gt;(static_cast&lt;char*&gt;(t) - sizeof(Node))</code> einen Node* daraus zu basteln. Das wäre auf jeden Fall schonmal fummelig zu implementieren (viel placement new, Ausrechnen des nötigen Alignment).</p>
<p>Zusätzlicher Overhead würde dadurch bloss beim Zugriff auf das erste Node-Member entstehen (z.B. [Register + Offset] Adressierung statt einfach nur [Register]).<br />
Dafür würde das Dereferenzieren eines Iterators sogar billiger, weil dort die Addition wegfällt.<br />
Das ist zwar ein Tausch den ich für durchaus vertretbar halten würde, aber &quot;kein zusätzlicher Overhead&quot; kann man es auch nicht wirklich nennen.</p>
<p>BTW: garantiert der Standard dass ein Alignment-Requirement immer nur eine Zweierpotenz sein kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248777</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 05 Sep 2012 16:30:07 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Wed, 05 Sep 2012 16:33:29 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a><br />
Du meinst jetzt nur die Instanzierung der Container-Klasse selbst...? Oder auch die Instanzierung von Memberfunktionen die T gar nicht wirklich verwenden sondern nur Zeiger/Referenzen darauf rumreichen?</p>
</blockquote>
<p>Nur die Klasse selbst und ggf - soweit möglich - von Typen, die darin deklariert werden (wie z.B. iterator). Nur dass diese wird man in der Regel in der Klassendefinition direkt benötigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248778</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 05 Sep 2012 16:33:29 GMT</pubDate></item><item><title><![CDATA[Reply to Member-Iterator auf eigene Klasse on Wed, 05 Sep 2012 16:37:24 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>BTW: garantiert der Standard dass ein Alignment-Requirement immer nur eine Zweierpotenz sein kann?</p>
</blockquote>
<p>n3337 schrieb:</p>
<blockquote>
<p>3.11/4 Alignments are represented as values of the type std::size_t. Valid alignments include only those values<br />
returned by an alignof expression for the fundamental types plus an additional implementation-defined set<br />
of values, which may be empty. <strong>Every alignment value shall be a non-negative integral power of two.</strong></p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2248782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248782</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 05 Sep 2012 16:37:24 GMT</pubDate></item></channel></rss>