<?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[Ähm.. Hilfe? :) Performancefrage.]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe momentan ein &quot;Konzept&quot;, das in etwa so aufgebaut ist. (Auf Konstruktoren/Destruktoren etc. ist natürlich verzichtet worden.)</p>
<pre><code class="language-cpp">class Base
{
public:
  virtual void foo() = 0;
};

class Fan : public Base
{
public:
  void foo()
  {
    std::cout &lt;&lt; &quot;Fan-Base!\n&quot;;
  }
};

class BaseManager
{
  std::vector&lt;Base*&gt; bases_;
public:
  void add(Base *base)
  {
    bases_.push_back(base);
  }
  void foo()
  {
    for (auto i = bases_.begin(); i != bases_.end(); ++i)
      (*i)-&gt;foo();
  }
};

int main()
{
  BaseManager mngr;
  mngr.addBase(new Fan());
  mngr.foo();
}
</code></pre>
<p>Das funktioniert soweit natürlich. Allerdings sehe ich hier einige Probleme. Abgesehen von den viele Cache-Misses, die das Ganze produzieren wird, dauert es ewig, sehr viele (kleine) einzelne Objekte zu allokieren bzw. wieder freizugeben. Es wäre irgendwie schön, wenn man mehr Speicher am Stück reservieren könnte, sodass die Daten nicht alle völlig vereinzelt im Speicher liegen. Trotzdem möchte ich natürlich nicht für jede von Base erbende Klasse eine eigene &quot;addXY&quot;-Funktion in der Manager-Klasse basteln. Hat jemand hier eine Idee?</p>
<p>Edit:<br />
Das sollte doch eigentlich ein öfter vorkommendes Problem sein? Vielleicht gibt es ja sogar ein Standard-Pattern dafür, aber ich kann nichts finden. <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/topic/293446/ähm-hilfe-performancefrage</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 08:53:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/293446.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Oct 2011 10:56:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ähm.. Hilfe? :) Performancefrage. on Mon, 03 Oct 2011 11:01:59 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe momentan ein &quot;Konzept&quot;, das in etwa so aufgebaut ist. (Auf Konstruktoren/Destruktoren etc. ist natürlich verzichtet worden.)</p>
<pre><code class="language-cpp">class Base
{
public:
  virtual void foo() = 0;
};

class Fan : public Base
{
public:
  void foo()
  {
    std::cout &lt;&lt; &quot;Fan-Base!\n&quot;;
  }
};

class BaseManager
{
  std::vector&lt;Base*&gt; bases_;
public:
  void add(Base *base)
  {
    bases_.push_back(base);
  }
  void foo()
  {
    for (auto i = bases_.begin(); i != bases_.end(); ++i)
      (*i)-&gt;foo();
  }
};

int main()
{
  BaseManager mngr;
  mngr.addBase(new Fan());
  mngr.foo();
}
</code></pre>
<p>Das funktioniert soweit natürlich. Allerdings sehe ich hier einige Probleme. Abgesehen von den viele Cache-Misses, die das Ganze produzieren wird, dauert es ewig, sehr viele (kleine) einzelne Objekte zu allokieren bzw. wieder freizugeben. Es wäre irgendwie schön, wenn man mehr Speicher am Stück reservieren könnte, sodass die Daten nicht alle völlig vereinzelt im Speicher liegen. Trotzdem möchte ich natürlich nicht für jede von Base erbende Klasse eine eigene &quot;addXY&quot;-Funktion in der Manager-Klasse basteln. Hat jemand hier eine Idee?</p>
<p>Edit:<br />
Das sollte doch eigentlich ein öfter vorkommendes Problem sein? Vielleicht gibt es ja sogar ein Standard-Pattern dafür, aber ich kann nichts finden. <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/2126602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126602</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 03 Oct 2011 11:01:59 GMT</pubDate></item><item><title><![CDATA[Reply to Ähm.. Hilfe? :) Performancefrage. on Mon, 03 Oct 2011 11:02:35 GMT]]></title><description><![CDATA[<p>Du könntest operator new() für die Klassen, die von Base erben, überladen. Wie man das macht, steht z.B. in &quot;Effective C++&quot;. D.h. du allozierst für die verschiedenen Typen Speicherblöcke (so etwas wie std::deque). Mehrere verschiedene Blöcke deswegen, weil Typen eine unterschiedliche Größe haben können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126609</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Mon, 03 Oct 2011 11:02:35 GMT</pubDate></item><item><title><![CDATA[Reply to Ähm.. Hilfe? :) Performancefrage. on Mon, 03 Oct 2011 11:10:38 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>Du könntest operator new() für die Klassen, die von Base erben, überladen. Wie man das macht, steht z.B. in &quot;Effective C++&quot;. D.h. du allozierst für die verschiedenen Typen Speicherblöcke (so etwas wie std::deque). Mehrere verschiedene Blöcke deswegen, weil Typen eine unterschiedliche Größe haben können.</p>
</blockquote>
<p>Sind dafür nicht <a href="http://en.wikipedia.org/wiki/Allocator_(C%2B%2B)" rel="nofollow">Allocator (C++)</a> zuständig, den man als zusätzlichen <code>template</code> -Parameter angeben kann?<br />
Ist zwar komplizierter als nur ein neues <code>new</code> aber &quot;riecht besser&quot; und kannst gezielt einsetzen.</p>
<p>Edit:<a href="http://www.angelikalanger.com/Articles/C++Report/Allocators/Allocators.html" rel="nofollow">Allocator</a> durch <a href="http://en.wikipedia.org/wiki/Allocator_(C%2B%2B)" rel="nofollow">Allocator (C++)</a> ausgetuscht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126615</guid><dc:creator><![CDATA[Rhombicosidodecahedron]]></dc:creator><pubDate>Mon, 03 Oct 2011 11:10:38 GMT</pubDate></item><item><title><![CDATA[Reply to Ähm.. Hilfe? :) Performancefrage. on Mon, 03 Oct 2011 11:14:59 GMT]]></title><description><![CDATA[<p>Rhombicosidodecahedron schrieb:</p>
<blockquote>
<p>wxSkip schrieb:</p>
<blockquote>
<p>Du könntest operator new() für die Klassen, die von Base erben, überladen. Wie man das macht, steht z.B. in &quot;Effective C++&quot;. D.h. du allozierst für die verschiedenen Typen Speicherblöcke (so etwas wie std::deque). Mehrere verschiedene Blöcke deswegen, weil Typen eine unterschiedliche Größe haben können.</p>
</blockquote>
<p>Ist dafür nicht der <a href="http://www.angelikalanger.com/Articles/C++Report/Allocators/Allocators.html" rel="nofollow">Allocator</a> zuständig, den man als zusätzlichen <code>template</code> -Parameter angeben kann?<br />
Ist zwar komplizierter als nur ein neues <code>new</code> aber &quot;riecht besser&quot; und kannst gezielt einsetzen.</p>
</blockquote>
<p>Und wie soll das funktionieren? So?</p>
<pre><code class="language-cpp">template&lt;typename T&gt; class Allocator;
template&lt;&gt; class Allocator&lt;Fan&gt;
{
    static std::deque fan_blocks;
    public:
    Fan *allocate(Fan const &amp;fan)
    {
        fan_blocks.push_back(fan);
        return &amp;fan_blocks.back(); //weiß nicht genau, ob die auch nach Vergrößerung noch gültig sind, aber so ungefähr
    }
}

template&lt;typename T&gt; void BaseManager::add(T const &amp;in)
{
    bases_.push_back(Allocator&lt;T&gt;().allocate(in));
}
</code></pre>
<p>So, dann hätten wir nur noch ein kleines Problem mit der Deallokation. Viel Spaß <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/2126624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126624</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Mon, 03 Oct 2011 11:14:59 GMT</pubDate></item><item><title><![CDATA[Reply to Ähm.. Hilfe? :) Performancefrage. on Mon, 03 Oct 2011 11:28:16 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Das funktioniert soweit natürlich. Allerdings sehe ich hier einige Probleme. Abgesehen von den viele Cache-Misses</p>
</blockquote>
<p>Ist der Manager performance kritisch? Also Base::foo() eine kleine Funktion und die Schleife wird oft mit extrem vielen Elementen durchlaufen? Wenn nicht, dann optimierst du an der falschen Stelle.</p>
<p>für die allokation: small object allocator. Gibt auch was in Boost dazu, wenn ich mich recht entsinne. Allerdings löst dies das Fragmentierungsproblem nur halb.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126629</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Mon, 03 Oct 2011 11:28:16 GMT</pubDate></item><item><title><![CDATA[Reply to Ähm.. Hilfe? :) Performancefrage. on Mon, 03 Oct 2011 12:14:13 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Trotzdem möchte ich natürlich nicht für jede von Base erbende Klasse eine eigene &quot;addXY&quot;-Funktion in der Manager-Klasse basteln.</p>
</blockquote>
<p>Wer einen Manager baut, mag auch addXY-Funktionen, natürlich mit dem sogenannten perfect forwarding. Alternativ auch emplace-Funktionen oder einen überladenen operartor new.</p>
<p>Ich würde die Lektüre von &quot;modern c++ design&quot; empfehlen für small object allocators und ich mag noch einwerfen, daß man sich richtiges new/delete manchmal schenken kann, wenn man erst alle reintut und dann alle löscht, und natürlich simple Freispeicherlisten erwähnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126659</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 03 Oct 2011 12:14:13 GMT</pubDate></item><item><title><![CDATA[Reply to Ähm.. Hilfe? :) Performancefrage. on Mon, 03 Oct 2011 17:29:47 GMT]]></title><description><![CDATA[<p>Klassen dessen Namen den String &quot;Manager&quot; containieren sind böse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126806</guid><dc:creator><![CDATA[tenance]]></dc:creator><pubDate>Mon, 03 Oct 2011 17:29:47 GMT</pubDate></item></channel></rss>