<?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[Boost.Intrusive]]></title><description><![CDATA[<p>Hallo,</p>
<p>mal eine ganz allgemeine Frage.<br />
Bisher habe ich primär mit der STL programmiert.<br />
In der Boost.Intrusive befinden sich zahlreiche Container mit Spezifikation<br />
des darunterliegenden Algorithmus.</p>
<p>In welchem Fall zieht ihr die STL und wann die Boost Library vor?<br />
Welche Conteiner in Boost.Intrusive haltet ihr für besonders empfehlenswert,<br />
welche eher nicht?</p>
<p>Danke,<br />
Mark</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277038/boost-intrusive</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 03:08:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277038.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Nov 2010 01:11:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 01:11:25 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mal eine ganz allgemeine Frage.<br />
Bisher habe ich primär mit der STL programmiert.<br />
In der Boost.Intrusive befinden sich zahlreiche Container mit Spezifikation<br />
des darunterliegenden Algorithmus.</p>
<p>In welchem Fall zieht ihr die STL und wann die Boost Library vor?<br />
Welche Conteiner in Boost.Intrusive haltet ihr für besonders empfehlenswert,<br />
welche eher nicht?</p>
<p>Danke,<br />
Mark</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979239</guid><dc:creator><![CDATA[Boost Newbie]]></dc:creator><pubDate>Fri, 12 Nov 2010 01:11:25 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 02:14:33 GMT]]></title><description><![CDATA[<p>Intrusive Collections sind hauptsächlich dann interessant, wenn es auf das letzte Bisschen Performance ankommt.<br />
Speziell also bei Low-Level Dingen die - abgesehen von Collection-Code - sehr schnell arbeiten.</p>
<p>Beispiel: eine FIFO Queue oder Priority-Queue die Zeiger auf irgendwelche Dinge speichert. Etwas konkreter: vielleicht eine Queue für einen Thread-Pool Job-Scheduler der darauf optimiert ist sehr &quot;kleine&quot; Jobs zu verteilen. Oder ein MRU Cache der &quot;einfache&quot; Keys verwendet (z.B. Integers).</p>
<p>p.S.: am interessantesten ist vermutlich list. Danach die diversen Bäumchen. Welcher der Bäume hängt stark von der Verwendung ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979240</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 12 Nov 2010 02:14:33 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 07:47:23 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort hustbaer!</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>p.S.: am interessantesten ist vermutlich list.</p>
</blockquote>
<p>Das wundert mich etwas...<br />
Denn strukturell kann ich mir keine so großen Unterschiede zwischen<br />
list und der STL list vorstellen.<br />
Was ist denn da der Unterschied?<br />
Da du von Performance redest, vermute ich, dass die Anzahl der dynamischen<br />
Speicher-Allokationen gering gehalten wird, indem Speicher<br />
für mehrere Listenelemente gleichzeitig reserviert wird, die in einem<br />
zusammenhängenden Block liegen.<br />
Liege ich da richtig?</p>
<p>Gruß,<br />
Mark</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979281</guid><dc:creator><![CDATA[Boost Newbie]]></dc:creator><pubDate>Fri, 12 Nov 2010 07:47:23 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 07:49:51 GMT]]></title><description><![CDATA[<p>Die intrusiven Container sind wie schon gesagt auf Performance ausgelegt. Da man nie &quot;frühzeitig optimiert&quot; beginne ich immer mit der STL. Wenn man dann feststellt, dass eine std::list einen großen Anteil an unangenehmen Wartezeiten hat, kann man sie durch eine intrusive Liste ersetzen.<br />
Etwas anderes sind Container, die tatsächliche Funktionserweiterungen darstellen, wie z.B. der boost multi index container. So etwas mit der STL nachzubauen, wäre viel zu aufwändig, da setzt man direkt auf die fertige Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979282</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Fri, 12 Nov 2010 07:49:51 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 07:52:52 GMT]]></title><description><![CDATA[<p>Boost Newbie schrieb:</p>
<blockquote>
<p>Was ist denn da der Unterschied?</p>
</blockquote>
<p>Die Speicherverwaltung wird con dir übernommen, du speicherst z.B. alle Elemente in einem vector. Die intrusive list speichert selber goar nix, sie verwaltet nur die Zeiger nach vorne und hinten, die in den Elementen selber gespeichert sind. Da liegt dann auch der große Nachteil, du musst die Datentypen, die du speichern möchtest anpassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979283</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Fri, 12 Nov 2010 07:52:52 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 09:10:39 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/doc/libs/1_37_0/doc/html/intrusive/intrusive_vs_nontrusive.html" rel="nofollow">&quot;Intrusive and non-intrusive containers&quot;</a> sagt doch eigentlich alles.</p>
<p>Ich habe bisher für Boost.Intrusive keine Verwendung gehabt.</p>
<p>Was das Kopieren von Objekten bei STL-Containern angeht, so wird das in C++0x nicht mehr nötig sein. Man kann Objekte direkt in den Containern erzeugen. Beispiel:</p>
<pre><code class="language-cpp">class foo
{
public:
  foo(int n, std::string s)
  : cieffs_(n), name_(std::move(s))
  {}
  foo(int n, char const* p)
  : coeffs_(n), name_(p)
  {}
private:
  std::vector&lt;double&gt; coeffs_;
  std::string name_;
};

...

std::list&lt;foo&gt; fl;
fl.emplace_back(256,&quot;yay!&quot;);
</code></pre>
<p>Der einzige praktische Unterschied zu einer &quot;Intrusive List&quot; ist dann, dass immer noch Speicher für die Elemente von std::list dynamisch reserviert und verwaltet wird, während Du bei einer &quot;Intrusive List&quot; Dich komplett selbst darum kümmern musst (Da werden nur Zeiger umgebogen, sonst nichts, keine Allozierung, keine Freigabe).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979313</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 12 Nov 2010 09:10:39 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 11:31:39 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Ich habe bisher für Boost.Intrusive keine Verwendung gehabt.</p>
</blockquote>
<p>Komisch.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Was das Kopieren von Objekten bei STL-Containern angeht, so wird das in C++0x nicht mehr nötig sein. Man kann Objekte direkt in den Containern erzeugen. Beispiel:</p>
<pre><code class="language-cpp">class foo
{
private:
  std::vector&lt;double&gt; coeffs_;
  ...
};
</code></pre>
</blockquote>
<p>Ja, aber</p>
<pre><code class="language-cpp">class foo
{
private:
  std::tr1::array&lt;double,10&gt; coeffs_;
};
</code></pre>
<p>!</p>
<p>Und selbst hier ist vector noch ok oder schneller. Aber wenn ich nicht nur so Objekte anlege und lösche, sondern auch von einem Container zum anderen bewege, könnten intrusive Listen fein sein.<br />
shared_ptrs zu verwalten, ist für mich keine naheliegende Alternative. Es wäre nur ein (langsamer) Kunstgriff, während Elemente intrusiver Listen auf natürliche Weise umhängbar sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979390</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 12 Nov 2010 11:31:39 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 11:47:11 GMT]]></title><description><![CDATA[<p>Ich hab nen wichtigen Punkt vergessen: no-throw Garantie.</p>
<blockquote>
<p>Der einzige praktische Unterschied zu einer &quot;Intrusive List&quot; ist dann, dass immer noch Speicher für die Elemente von std::list dynamisch reserviert und verwaltet wird,</p>
</blockquote>
<p>Und das macht nen RIESEN Unterschied wenn die Elemente z.B. gerade mal aus 4-8 Byte bestehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979394</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 12 Nov 2010 11:47:11 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 12:16:32 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>...<br />
Ja, aber</p>
<pre><code class="language-cpp">class foo
{
private:
  std::tr1::array&lt;double,10&gt; coeffs_;
};
</code></pre>
<p>!</p>
</blockquote>
<p>Was ist denn damit? Erklär mal...</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Und selbst hier ist vector noch ok oder schneller. Aber wenn ich nicht nur so Objekte anlege und lösche, sondern auch von einem Container zum anderen bewege, könnten intrusive Listen fein sein. ... während Elemente intrusiver Listen auf natürliche Weise umhängbar sind.</p>
</blockquote>
<p>Das kann ich mit list&lt;&gt;::splice doch auch.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<blockquote>
<p>Der einzige praktische Unterschied zu einer &quot;Intrusive List&quot; ist dann, dass immer noch Speicher für die Elemente von std::list dynamisch reserviert und verwaltet wird,</p>
</blockquote>
<p>Und das macht nen RIESEN Unterschied wenn die Elemente z.B. gerade mal aus 4-8 Byte bestehen.</p>
</blockquote>
<p>...kommt drauf an, wie und wo du die Dinger im Falle einer Intrusive List anlegst und was für einen Allocator Du im Falle von std::list verwendest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979407</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 12 Nov 2010 12:16:32 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 12:45:23 GMT]]></title><description><![CDATA[<p>Danke für die zahlreichen Antworten!</p>
<p>Ich lese weiterhin interessiert mit, auch wenn ich mich in die Dsikussion nicht einmischen kann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979420</guid><dc:creator><![CDATA[Boost Newbie]]></dc:creator><pubDate>Fri, 12 Nov 2010 12:45:23 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 14:30:23 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>...<br />
Ja, aber</p>
<pre><code class="language-cpp">class foo
{
private:
  std::tr1::array&lt;double,10&gt; coeffs_;
};
</code></pre>
<p>!</p>
</blockquote>
<p>Was ist denn damit? Erklär mal...</p>
</blockquote>
<p>Da wird move stärend langsam.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979498</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 12 Nov 2010 14:30:23 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 14:44:12 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>...kommt drauf an, wie und wo du die Dinger im Falle einer Intrusive List anlegst und was für einen Allocator Du im Falle von std::list verwendest.</p>
</blockquote>
<p>Oh, mit rebind war ich nie glücklich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979505</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 12 Nov 2010 14:44:12 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 15:43:29 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>...<br />
Ja, aber</p>
<pre><code class="language-cpp">class foo
{
private:
  std::tr1::array&lt;double,10&gt; coeffs_;
};
</code></pre>
<p>!</p>
</blockquote>
<p>Was ist denn damit? Erklär mal...</p>
</blockquote>
<p>Da wird move stärend langsam.</p>
</blockquote>
<p>Ich sehe jetzt hier keinen Zusammenhang. Was hat das denn mit std::list zu tun? Mit list&lt;&gt;::emplace kannst Du so ein Objekt direkt in der Liste erzeugen, ohne dass da etwas kopiert oder &quot;bewegt&quot; werden muss. Und list&lt;&gt;::splice stört das auch nicht, falls ein Typ nur aufwändig kopiert bzw &quot;bewegt&quot; werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979549</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 12 Nov 2010 15:43:29 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 15:49:47 GMT]]></title><description><![CDATA[<p>Du hast doch bei emplace() eine Allokation.<br />
Die kannst du mit intrusive Listen sparen.</p>
<p>Im Prinzip verwende ich intrusive Container immer dann wenn ich diese Allokationen sparen will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979553</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 12 Nov 2010 15:49:47 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Fri, 12 Nov 2010 16:38:59 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Du hast doch bei emplace() eine Allokation.<br />
Die kannst du mit intrusive Listen sparen.</p>
</blockquote>
<p>Irgendwer muss irgendwo die Objekte erzeugen. Ob das jetzt std::list&lt;&gt; über den Allocator macht oder Du selbst macht ja nur dann einen Unterschied, wenn Du nicht extra für jedes Objekt new/malloc verwendest. Wenn Du nicht für jedes Objekt new/malloc verwenden willst, musst Du sie entweder im statischen Speicher anlegen, auf'm Stack (falls dadurch eine ausreichende Lebenszeit garantiert werden kann) oder Speicher für die Objekte in größeren Blöcken dynamisch anfordern. Letzteres ist aber auch das, was ein &quot;small object allocator&quot; macht.</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Im Prinzip verwende ich intrusive Container immer dann wenn ich diese Allokationen sparen will.</p>
</blockquote>
<p>Das sagst Du so, als wären std::list&lt;&gt; und boost::intrusive::list&lt;&gt; austauschbar. Wenn Du Allozierungen sparen willst, wie erzeugst Du dann Deine Objekte und wer &quot;kümmert&quot; sich darum? Bring doch mal ein konkretes Beispiel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979585</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 12 Nov 2010 16:38:59 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Sat, 13 Nov 2010 06:22:29 GMT]]></title><description><![CDATA[<p>Der Unterschied liegt darin, dass du die Größe der abgeforderten Speicherressourcen<br />
kalkulieren kannst!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979763</guid><dc:creator><![CDATA[Difference]]></dc:creator><pubDate>Sat, 13 Nov 2010 06:22:29 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Sat, 13 Nov 2010 15:32:29 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a>:<br />
Auch ein wichtiger Punkt ist dass man mit intrusive Containern eine &quot;no throw&quot; Garantie umsetzen kann.</p>
<p>Ein konkretes Beispiel das ich schon erwähnt habe: ein Job-Scheduler.<br />
Sagen wir du möchtest bestimmte Dinge gleichzeitig ausführen lassen, dann aber innerhalb der gleichen Funktion auf deren Abschluss warten.<br />
Einsatzbereiche dafür gibt es genügend, z.B. parallelisierung von Algorithmen.</p>
<pre><code class="language-cpp">int DoStuffParallel(..., Scheduler&amp; s) // no-throw
{
    // Wir erzeugen Futures am Stack, die Ausführung übernimmt der Scheduler
    InStackFuture&lt;int&gt; const&amp; f1 = MakeInStackFuture(s, bind(&amp;DoStuffParallel, ..., ref(s)));
    InStackFuture&lt;int&gt; const&amp; f2 = MakeInStackFuture(s, bind(&amp;DoStuffParallel, ..., ref(s)));
    // Wir warten darauf dass beide Futures &quot;fertig&quot; sind
    Wait(f1, f2);
    // Wir kombinieren das Ergebnis und geben es zurück
    return f1.Get() + f2.Get();
}
</code></pre>
<p>Sowas schreit geradezu nach einem intrusive Container im Scheduler.<br />
Dadurch wird alles schneller, und anders wäre es kaum möglich zu garantieren dass nirgends Exceptions geworfen werden.</p>
<p>Anderes Beispiel: du willst ein GUI Framework basteln. Oder einen Scene-Graph. Natürlich kann man hier mit normalen Listen/Vektoren arbeiten, nur da jedes Objekt immer nur einen Parent haben darf, kann man genauso gut intrusive Listen verwenden.</p>
<p>emplace() fällt flach, da man die Objekte üblicherweise unabhängig vom Parent/Graphen erzeugen möchte, auch wieder rausnehmen können möchte etc. move() fällt flach, da die Objekte &quot;identity&quot; haben (=die Adresse sollte sich nicht ändern).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979947</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 13 Nov 2010 15:32:29 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Tue, 16 Nov 2010 03:46:10 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class foo
{
public:
  foo(int n, std::string s)
//...
};
std::list&lt;foo&gt; fl;
fl.emplace_back(256,&quot;yay!&quot;);
</code></pre>
</blockquote>
<p>Wie funktioniert sowas denn? wie kann man einer dynamische Anzahl von Parametern<br />
an den Konstruktor weitergeben?<br />
Also wie wird soetwas intern realisiert?<br />
Wie sieht die Funktionssignatur von emplace aus und wie wird<br />
der Konstruktoraufruf durchgeführt?</p>
<p>Gruß,<br />
Karsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981056</guid><dc:creator><![CDATA[KaJenDro]]></dc:creator><pubDate>Tue, 16 Nov 2010 03:46:10 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Wed, 17 Nov 2010 12:12:11 GMT]]></title><description><![CDATA[<p>KaJenDro schrieb:</p>
<blockquote>
<p>Wie funktioniert sowas denn? wie kann man einer dynamische Anzahl von Parametern<br />
an den Konstruktor weitergeben?<br />
Also wie wird soetwas intern realisiert?</p>
</blockquote>
<p>Stichwort: Variadic Templates + Perfect Forwarding (C++0x)</p>
<pre><code class="language-cpp">template&lt;class T&gt;
struct list_node
{
  list_node *prev;
  list_node *next;
  T value;

  template&lt;class...Args&gt;
  explicit list_node(Args&amp;&amp;...args)
  : prev(0), next(0),
    value(std::forward&lt;Args&gt;(args)...)
  {}
};

template&lt;class T&gt;
class list
{
public:
  ...

  template&lt;class...Args&gt;
  iterator emplace(iterator it, Args&amp;&amp;...args)
  {
    ...
    list_node&lt;T&gt; p = new list_node&lt;T&gt;(std::forward&lt;Args&gt;(args)...);
    ...
  }

private:
  ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1981073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981073</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 17 Nov 2010 12:12:11 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Tue, 16 Nov 2010 09:21:44 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Irgendwer muss irgendwo die Objekte erzeugen. Ob das jetzt std::list&lt;&gt; über den Allocator macht oder Du selbst macht ja nur dann einen Unterschied, wenn Du nicht extra für jedes Objekt new/malloc verwendest. Wenn Du nicht für jedes Objekt new/malloc verwenden willst, musst Du sie entweder im statischen Speicher anlegen, auf'm Stack (falls dadurch eine ausreichende Lebenszeit garantiert werden kann) oder Speicher für die Objekte in größeren Blöcken dynamisch anfordern. Letzteres ist aber auch das, was ein &quot;small object allocator&quot; macht.</p>
</blockquote>
<p>Bedenke dass du bei jedem new locken musst. Du kannst keine allocatoren in der STL verwenden die nur thread lokal sind, denn dann könntest du ja nicht splicen und das ist wichtiger als alles andere.</p>
<p>deshalb ist der trick einfach ein großes alloc zu machen und so nur einmal zu locken.</p>
<p>natürlich könnte man einen nicht konformen allocator verwenden... dann bleibt immer noch das problem der kopie die man beim einfügen in die liste hat. und kopien können wieder allokieren. also brauchen wir move semantik dafür - nur leider ist move auch nicht immer das was man will (identity problem).</p>
<p>Letztens habe ich intrusive Listen bei caches verwendet. Caches haben eine fixe größe, also ist es einfach das in einem rutsch zu allokieren. und der schöne trick dabei war dann, dass es möglich war zeiger auf die einzelnen cache objekte zu speichern auch wenn die liste durchsortiert wurde (je nachdem ob man lfu oder lru verwenden wollte) da die zeiger ja nie ungültig wurden.</p>
<p>klar, intrusive container sind nichts was man dauernd braucht - aber ab und zu sind sie einfach perfekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981104</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 16 Nov 2010 09:21:44 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Tue, 16 Nov 2010 19:34:37 GMT]]></title><description><![CDATA[<p>Danke krümelkacker!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981384</guid><dc:creator><![CDATA[KaJenDro]]></dc:creator><pubDate>Tue, 16 Nov 2010 19:34:37 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Intrusive on Sat, 15 Jan 2011 11:30:45 GMT]]></title><description><![CDATA[<p>Eine schöne Einführung und Erklärung von Intrusiven Datenstrukturen mit Erklärungen, warum das so gut ist findet sich bei <a href="http://www.codefarms.com" rel="nofollow">www.codefarms.com</a> (möglicherweise der Erfinder) hier:<br />
<a href="http://www.codefarms.com/publications/intrusiv/Intrusive.pdf" rel="nofollow">http://www.codefarms.com/publications/intrusiv/Intrusive.pdf</a></p>
<p>Gruß, Stephan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006838</guid><dc:creator><![CDATA[tarmin]]></dc:creator><pubDate>Sat, 15 Jan 2011 11:30:45 GMT</pubDate></item></channel></rss>