<?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[op new&#x2F;delete vererbbar?]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe hier eine Klassen Hierarchie:</p>
<pre><code class="language-cpp">class A{};
struct B:A{};
struct C:A{};
struct D:C{};
//... uvm ...
</code></pre>
<p>u.a. aus Performance Gründen, möchte ich nun versuchen, ob eine eigene Speicherverwaltung hier Vorteile bringt. Um das zu wissen, muss ich da wohl aber effektiv testen, und dabei natürlich möglichst wenig arbeit haben.<br />
Zumindest was die Implementierung angeht.</p>
<p>Aktuell ist dies meine Überlegung:</p>
<pre><code class="language-cpp">template&lt;class T, class alloc_impl = alloc_impl&lt;sizeof(T)&gt; &gt;
class new_impl : public T
{
	alloc_impl alloc;
public:
	void* operator new(size_t size)
	{
		if(size != sizeof(new_impl&lt;T,alloc_impl&gt;))
			return ::operator new(size);
		return alloc.allocate(size);
	}
	void operator delete(void* p, size_t size)
	{
		if(size != sizeof(new_impl&lt;T,alloc_impl&gt;))
			return ::operator delete(size);
		return alloc.deallocate(size);
	}
};
</code></pre>
<p>A erbt dann einfach von new_impl.<br />
Solange die Kinder die größe von sizeof(A) haben, ist das auch ne sichere sache.<br />
Haben sie aber nich. mist. Mehrfachvererbung könnte man jetzt sagen, ala struct B:A,new_impl&lt;B&gt;<br />
Da bleibt für mich jetzt die frage, ob sizeof(B) in new_impl&lt;B &gt; jetzt auch hier von A weiss?<br />
Falls ja, super, problem gelöst.</p>
<p>Anderenfalls müsste ich wohl zu einer Art Man-in-the-Middle Vererbung greifen:</p>
<pre><code class="language-cpp">template&lt;class T,class parent = T, class alloc_impl = alloc_impl&lt;sizeof(T)&gt; &gt;
class new_impl : public parent
{
  ...
};
class A:new_impl&lt;A&gt;{};
class B:new_impl&lt;B,A&gt;
</code></pre>
<p>Kann man operator new/delete so vererben?<br />
Gibt es einen besseren Ansatz, wenn man &quot;Nachrüsten&quot; will?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/283258/op-new-delete-vererbbar</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 16:45:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/283258.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Mar 2011 13:24:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to op new&#x2F;delete vererbbar? on Tue, 08 Mar 2011 13:24:07 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe hier eine Klassen Hierarchie:</p>
<pre><code class="language-cpp">class A{};
struct B:A{};
struct C:A{};
struct D:C{};
//... uvm ...
</code></pre>
<p>u.a. aus Performance Gründen, möchte ich nun versuchen, ob eine eigene Speicherverwaltung hier Vorteile bringt. Um das zu wissen, muss ich da wohl aber effektiv testen, und dabei natürlich möglichst wenig arbeit haben.<br />
Zumindest was die Implementierung angeht.</p>
<p>Aktuell ist dies meine Überlegung:</p>
<pre><code class="language-cpp">template&lt;class T, class alloc_impl = alloc_impl&lt;sizeof(T)&gt; &gt;
class new_impl : public T
{
	alloc_impl alloc;
public:
	void* operator new(size_t size)
	{
		if(size != sizeof(new_impl&lt;T,alloc_impl&gt;))
			return ::operator new(size);
		return alloc.allocate(size);
	}
	void operator delete(void* p, size_t size)
	{
		if(size != sizeof(new_impl&lt;T,alloc_impl&gt;))
			return ::operator delete(size);
		return alloc.deallocate(size);
	}
};
</code></pre>
<p>A erbt dann einfach von new_impl.<br />
Solange die Kinder die größe von sizeof(A) haben, ist das auch ne sichere sache.<br />
Haben sie aber nich. mist. Mehrfachvererbung könnte man jetzt sagen, ala struct B:A,new_impl&lt;B&gt;<br />
Da bleibt für mich jetzt die frage, ob sizeof(B) in new_impl&lt;B &gt; jetzt auch hier von A weiss?<br />
Falls ja, super, problem gelöst.</p>
<p>Anderenfalls müsste ich wohl zu einer Art Man-in-the-Middle Vererbung greifen:</p>
<pre><code class="language-cpp">template&lt;class T,class parent = T, class alloc_impl = alloc_impl&lt;sizeof(T)&gt; &gt;
class new_impl : public parent
{
  ...
};
class A:new_impl&lt;A&gt;{};
class B:new_impl&lt;B,A&gt;
</code></pre>
<p>Kann man operator new/delete so vererben?<br />
Gibt es einen besseren Ansatz, wenn man &quot;Nachrüsten&quot; will?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031267</guid><dc:creator><![CDATA[phlox@work]]></dc:creator><pubDate>Tue, 08 Mar 2011 13:24:07 GMT</pubDate></item><item><title><![CDATA[Reply to op new&#x2F;delete vererbbar? on Tue, 08 Mar 2011 19:09:51 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>Warum hast du in new_impl die Überprüfung?</p>
<pre><code class="language-cpp">void* operator new(size_t size)
    {
        if(size != sizeof(new_impl&lt;T,alloc_impl&gt;))//die
            return ::operator new(size);
        return alloc.allocate(size);
    }
</code></pre>
<p>ohne würde dein Unterfangen meines Wissens nach out-of-the-box funktionieren. Der Compiler ruft dann für D A::operator new (sizeof(D)) auf und alles ist Okay. Natürlich musste dann deinen Allocator etwas umschreiben, damit er sich mit einem memory-pool verbindet der verschiedene Größen Allokieren kann. Aber das brauchste hier ja auch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031459</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 08 Mar 2011 19:09:51 GMT</pubDate></item><item><title><![CDATA[Reply to op new&#x2F;delete vererbbar? on Wed, 09 Mar 2011 08:59:13 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Hey,</p>
<p>Warum hast du in new_impl die Überprüfung?</p>
<pre><code class="language-cpp">void* operator new(size_t size)
    {
        if(size != sizeof(new_impl&lt;T,alloc_impl&gt;))//die
            return ::operator new(size);
        return alloc.allocate(size);
    }
</code></pre>
<p>ohne würde dein Unterfangen meines Wissens nach out-of-the-box funktionieren. Der Compiler ruft dann für D A::operator new (sizeof(D)) auf und alles ist Okay. Natürlich musste dann deinen Allocator etwas umschreiben, damit er sich mit einem memory-pool verbindet der verschiedene Größen Allokieren kann. Aber das brauchste hier ja auch...</p>
</blockquote>
<p>Naja, also ich orientiere mich da an Effective C++, dort ist dass so beschrieben. Auch um das Standardverhalten von op new zu grantieren.<br />
Damit habe ich halt momentan für jede Größe einen eigenen Pool, könnte man natürlich auch in eine Instanz tun...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031627</guid><dc:creator><![CDATA[phlox@work]]></dc:creator><pubDate>Wed, 09 Mar 2011 08:59:13 GMT</pubDate></item><item><title><![CDATA[Reply to op new&#x2F;delete vererbbar? on Wed, 09 Mar 2011 09:50:48 GMT]]></title><description><![CDATA[<p>phlox@work schrieb:</p>
<blockquote>
<p>Naja, also ich orientiere mich da an Effective C++, dort ist dass so beschrieben.</p>
</blockquote>
<p>Dort ist dann bestimmt auch beschrieben dass eben diese Abfrage dazu da ist, dass abgeleitete Klassen mit sizeof(D) != sizeof(A) die Standard-Allokation benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031654</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 09 Mar 2011 09:50:48 GMT</pubDate></item><item><title><![CDATA[Reply to op new&#x2F;delete vererbbar? on Wed, 09 Mar 2011 10:50:39 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>phlox@work schrieb:</p>
<blockquote>
<p>Naja, also ich orientiere mich da an Effective C++, dort ist dass so beschrieben.</p>
</blockquote>
<p>Dort ist dann bestimmt auch beschrieben dass eben diese Abfrage dazu da ist, dass abgeleitete Klassen mit sizeof(D) != sizeof(A) die Standard-Allokation benutzen.</p>
</blockquote>
<p>Jo, genau.<br />
Nur stellt er das halt anhand einer recht kleinen Klasse vor, wobei ich hier ja das gerne auf eine schon bestehende Klassenhierarchie und mit möglichst hoher wiederverwendbarkeit implementieren will...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031678</guid><dc:creator><![CDATA[phlox@work]]></dc:creator><pubDate>Wed, 09 Mar 2011 10:50:39 GMT</pubDate></item><item><title><![CDATA[Reply to op new&#x2F;delete vererbbar? on Wed, 09 Mar 2011 12:43:06 GMT]]></title><description><![CDATA[<p>Da gibts verschiedene Möglichkeiten. Beispielsweise könntest du dein op new/Allokator Template jeweils als vorletztes in die Hierarchie einschieben, oder eben den Allokator allgemeiner gestalten für verschiedene Größen etc.</p>
<p>Deine &quot;man-in-the-middle&quot; Vererbung ist der Richtige weg, allerdings sollte parent nicht T sein, da du sonst zirkuläre vererbung hast (A erbt von new_impl, new_impl erbt von A,...):</p>
<pre><code class="language-cpp">struct Empty {};

template &lt;class T, class Parent = Empty, class Alloc = alloc_impl&lt;sizeof(T)&gt; &gt;
class new_impl : public Parent //Empty als Base können die meisten Compiler wegoptimieren
{
  /* ... */
};
</code></pre>
<p>Allerdings solltest du berücksichtigen, dass dabei die Zahl der Klassen in der Hierarchie verdoppelt wird und jede zweite davon (die new_impl) jeweils einen alloc als Member haben, von denen alle bis auf den letzten sinnlos sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031746</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 09 Mar 2011 12:43:06 GMT</pubDate></item><item><title><![CDATA[Reply to op new&#x2F;delete vererbbar? on Wed, 09 Mar 2011 13:24:27 GMT]]></title><description><![CDATA[<p>Jo, auf diese Man-in-the-Middle vererbung bin ich nicht angewiesen.<br />
sizeof(T) ist immer richtig, so das ich new_impl nicht von Parent ableiten muss.</p>
<p>Mit dem Allocator werde ich mich dann noch was beschäftigen müssen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031769</guid><dc:creator><![CDATA[phlox@work]]></dc:creator><pubDate>Wed, 09 Mar 2011 13:24:27 GMT</pubDate></item><item><title><![CDATA[Reply to op new&#x2F;delete vererbbar? on Wed, 09 Mar 2011 19:40:49 GMT]]></title><description><![CDATA[<p>Übrigens würde ich überladene <code>operator new</code> und <code>operator delete</code> als Member als <code>static</code> deklarieren. Auch wenn der C++-Standard das Schlüsselwort nicht verlangt, sind die Funktionen immer statisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031954</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 09 Mar 2011 19:40:49 GMT</pubDate></item></channel></rss>