<?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[Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln]]></title><description><![CDATA[<p>Ist es möglich die einzelnen Offset der Eltern Klassen zur ermitteln?<br />
Am Besten wäre compile Zeit, der Compiler müsste es definitiv wissen.</p>
<pre><code>struct A { int a; };
struct B { int b; };
struct C : A, B { int c; };
</code></pre>
<p>Hier in dem Beispiel sollte der Offset von Klasse C zu A 0 sein.<br />
Von Klasse C zu B =&gt; sizeof(int)</p>
<p>Hat jemand ne Idee wie ich an diese Offsets komme, ohne das ich jetzt auf die member zugreife?</p>
<p>PS: Mit ist klar das dass C++ Object layout nicht standardisiert ist.<br />
Mir reicht eine Antwort für VS oder gcc.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/319799/klassen-offset-von-der-kind-klasse-zu-den-eltern-klassen-ermitteln</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Jul 2026 20:59:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319799.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Sep 2013 19:05:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln on Tue, 03 Sep 2013 19:05:01 GMT]]></title><description><![CDATA[<p>Ist es möglich die einzelnen Offset der Eltern Klassen zur ermitteln?<br />
Am Besten wäre compile Zeit, der Compiler müsste es definitiv wissen.</p>
<pre><code>struct A { int a; };
struct B { int b; };
struct C : A, B { int c; };
</code></pre>
<p>Hier in dem Beispiel sollte der Offset von Klasse C zu A 0 sein.<br />
Von Klasse C zu B =&gt; sizeof(int)</p>
<p>Hat jemand ne Idee wie ich an diese Offsets komme, ohne das ich jetzt auf die member zugreife?</p>
<p>PS: Mit ist klar das dass C++ Object layout nicht standardisiert ist.<br />
Mir reicht eine Antwort für VS oder gcc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350113</guid><dc:creator><![CDATA[Nash26]]></dc:creator><pubDate>Tue, 03 Sep 2013 19:05:01 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln on Tue, 03 Sep 2013 19:18:46 GMT]]></title><description><![CDATA[<p>Du kannst es mit <a href="http://www.cplusplus.com/reference/cstddef/offsetof/" rel="nofollow">offsetof</a> versuchen.<br />
Alternativ die Pointer voneinander abziehen, sollte der Compiler als Konstante erkennen. Oder das in eine Funktion tun und constexpr davorschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350116</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 03 Sep 2013 19:18:46 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln on Tue, 03 Sep 2013 19:24:48 GMT]]></title><description><![CDATA[<p>Nun, offsetof böte sich an <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="🙂"
    /> . Funktioniert aber nur bei Klassen mit Standardlayout und das aus gutem Grund. Man könnte leicht ein Gegenbeispiel konstruieren, wo bei einer Klasse ohne Standardlayout die Frage nach einem Offset gar keinen Sinn mehr macht und ein offsetof entsprechend total schief geht.<br />
Allgemein ist offsetof aber ziemliches low-level Gehacke, wo man sogar in C schon schief angeguckt wird, wenn man es benutzt. Daher muss man erst recht in C++ fragen: Wozu willst du das wissen? Bei allem was ein bisschen komplexer wird, fliegt dir das um die Ohren.</p>
<p>P.S.: Die Voraussetzung von &quot;Standardlayout&quot; ist schon die entspannte Voraussetzung aus C++11. In C++98 ist die Voraussetzung sogar die strengere Forderung nach POD. Das geht dann mit fast nichts mehr, was man in C++ so gewöhnlich macht. Aber das liegt eher da dran, dass die Unterscheidung POD/Non-POD in C++98 ein bisschen doof ist(was durch die Änderung in C++11 korrigiert wurde). Das heißt, ein offsetof wird in Fällen, wo es in C++11 Standardlayout genannt würde, trotzdem funktionieren, selbst wenn es kein C++98-POD ist. Ebenso eigene Nachbauten von offsetof, welches wirklich nicht sehr komplex wäre (übliche Implementierung ist eine Pointerdifferenz). Aber ganz streng genommen, kann man sich nicht drauf verlassen. Bei GCC und MSVC kannst das aber schon so machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350117</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 03 Sep 2013 19:24:48 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln on Tue, 03 Sep 2013 19:22:18 GMT]]></title><description><![CDATA[<p>Ich wüsste nicht, wie sich hier offsetof anbietet. Eine Lösung für den GCC:</p>
<pre><code class="language-cpp">constexpr C* c = reinterpret_cast&lt;C*&gt;(0xDeadBeef); // darf nicht null sein                                                                           
  constexpr int offset = reinterpret_cast&lt;char*&gt;(static_cast&lt;A*&gt;(c)) - reinterpret_cast&lt;char*&gt;(c);
  std::cout &lt;&lt; offset &lt;&lt; '\n';
  constexpr int offset2 = reinterpret_cast&lt;char*&gt;(static_cast&lt;B*&gt;(c)) - reinterpret_cast&lt;char*&gt;(c);
  std::cout &lt;&lt; offset2 &lt;&lt; '\n';
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2350118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350118</guid><dc:creator><![CDATA[=0xdeadbeef]]></dc:creator><pubDate>Tue, 03 Sep 2013 19:22:18 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln on Tue, 03 Sep 2013 19:25:27 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Oder das in eine Funktion tun und constexpr davorschreiben.</p>
</blockquote>
<p>Zeigerdifferenzen sind niemals konstante Ausdrücke. reinterpret_cast auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350119</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 03 Sep 2013 19:25:27 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln on Tue, 03 Sep 2013 19:51:13 GMT]]></title><description><![CDATA[<p>das ganze soll natürlich für alle möglichen Klassen typen funktionieren.<br />
Also mit polymorphe Klassen (virtual methods), virtual base class etc.</p>
<p>Und bei offsetof muss man auf die member zugreifen, das wollte ich wie gesagt nicht.</p>
<p>Und btw. liefert mir in C++ nicht auch &amp;T::member die offset adresse?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350124</guid><dc:creator><![CDATA[Nash26]]></dc:creator><pubDate>Tue, 03 Sep 2013 19:51:13 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln on Tue, 03 Sep 2013 19:56:29 GMT]]></title><description><![CDATA[<p>Nash26 schrieb:</p>
<blockquote>
<p>das ganze soll natürlich für alle möglichen Klassen typen funktionieren.<br />
Also mit polymorphe Klassen (virtual methods), virtual base class etc.</p>
</blockquote>
<p>Wozu brauchst du das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350126</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 03 Sep 2013 19:56:29 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln on Tue, 03 Sep 2013 20:07:12 GMT]]></title><description><![CDATA[<p>Nash26 schrieb:</p>
<blockquote>
<p>das ganze soll natürlich für alle möglichen Klassen typen funktionieren.<br />
Also mit polymorphe Klassen (virtual methods), virtual base class etc.</p>
</blockquote>
<p>Dann macht die Frage an sich keinen Sinn mehr. Wenn virtual im Spiel ist, wirst du in der Regel eine konkrete Instanz benötigen, um überhaupt eine Aussage machen zu können, diese Information existiert gar nicht zur Compilezeit. daher kann man auch nicht danach fragen. Es kann daher keine sinnvolle Anwendung für diese Information geben. Daher Umformulierung der Gegenfrage von &quot;Wozu brauchst du das?&quot; zu: Wozu <strong>meinst</strong> du, das zu brauchen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350127</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 03 Sep 2013 20:07:12 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln on Tue, 03 Sep 2013 21:00:21 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a><br />
Dann musst du mir erklären warum es nicht zur Compilezeit geht, bzw. warum eine<br />
konkrete Instanz benötigt wird.<br />
Etwas anderes wäre, wenn du gesagt hättest ich komme nicht an diese Information ran.</p>
<pre><code>struct A { int a; };
struct B { int b; virtual fooBar() {} };
struct C : A, B { int c; };

C c;
c.fooBar(); // wird eventuell so hier übersetzt =&gt; c.__vptr[0]-&gt;fooBar(&amp;c);
// wo der __vptr sich befindet sollt der compiler wissen.
</code></pre>
<p>IMHO weiß der Compiler hier ganz genau zur Compilezeit denn offset.<br />
Aber natürlich nur wenn er das Kind Objekt hat.<br />
Klärt mich gerne auf warum das nicht so sein sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350130</guid><dc:creator><![CDATA[Nash26]]></dc:creator><pubDate>Tue, 03 Sep 2013 21:00:21 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln on Tue, 03 Sep 2013 21:30:05 GMT]]></title><description><![CDATA[<p>Ich dachte da primär an virtuelle Vererbung. Mit virtuellen Funktionen lässt sich bestimmt auch eine Gegenbeispiel basteln. Aber mit virtueller Vererbung ist es leicht:</p>
<pre><code>struct A { int a; };
struct B : public virtual A   { int b; };
struct C : public virtual A   { int c; };
struct D : public B, public C { int d; };

int main()
{
  // Von oben das offsetof Marke Eigenbau
  int offset = reinterpret_cast&lt;char*&gt;(static_cast&lt;A*&gt;(reinterpret_cast&lt;D*&gt;(0xDeadBeef))) - reinterpret_cast&lt;char*&gt;(reinterpret_cast&lt;C*&gt;(0xDeadBeef));
}
</code></pre>
<p>Sollte krachen, denn hier muss im vtable nachgeschlagen werden. Aber wir haben keine Instanz. Oder anstatt vtable, wie auch immer das virtual implementiert ist. Das ist eben auch so ein Problem, dass das alles mögliche sein <em>könnte</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350132</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 03 Sep 2013 21:30:05 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln on Tue, 03 Sep 2013 22:16:48 GMT]]></title><description><![CDATA[<p>ok dann gehe ich einen Schritt zurück.</p>
<pre><code>D d;
</code></pre>
<p>Bezug nehmend auf dein Beispiel:<br />
Wenn ich dieses D Objekt erzeuge, sollt doch der compiler alle offsets kennen (weil er sie ja selbst erzeugt)?<br />
Wenn nein, warum nicht?<br />
Wenn ja, wie komme ich an diese?</p>
<p>PS: was sollen diese komischen HexDez zahlen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350134</guid><dc:creator><![CDATA[Nash26]]></dc:creator><pubDate>Tue, 03 Sep 2013 22:16:48 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln on Wed, 04 Sep 2013 07:29:08 GMT]]></title><description><![CDATA[<p>Nash26 schrieb:</p>
<blockquote>
<p>PS: was sollen diese komischen HexDez zahlen?</p>
</blockquote>
<p>Einfach nur ein beliebiger Zeiger. Wenn der Ausdruck zur Compilezeit ausgewertet wird, ist es ja egal, ob der Zeiger irgendwann zur Laufzeit einmal gültig ist oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350150</guid><dc:creator><![CDATA[peterbernd]]></dc:creator><pubDate>Wed, 04 Sep 2013 07:29:08 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen offset von der Kind Klasse zu den Eltern Klassen ermitteln on Wed, 04 Sep 2013 08:35:47 GMT]]></title><description><![CDATA[<p>Nash26 schrieb:</p>
<blockquote>
<p>ok dann gehe ich einen Schritt zurück.</p>
<pre><code>D d;
</code></pre>
<p>Bezug nehmend auf dein Beispiel:<br />
Wenn ich dieses D Objekt erzeuge, sollt doch der compiler alle offsets kennen (weil er sie ja selbst erzeugt)?</p>
</blockquote>
<p>In diesem einfachen Fall vielleicht, aber nicht allgemein. Was ist der Offset von C zu A? Das ist schon nicht mehr zu beantworten.</p>
<blockquote>
<p>Wenn nein, warum nicht?</p>
</blockquote>
<p>Weil bei der virtuellen Vererbung das genaue Klassenlayout vom dynamischen Typ abhängt. Wenn das C Teil eines D ist, dann ist der Offset C zu A ein anderer als bei einem einfachen C.</p>
<blockquote>
<p>Wenn ja, wie komme ich an diese?</p>
</blockquote>
<p>Wie schon oft gesagt: Die Frage macht gar keinen Sinn, weil du nach etwas fragst, was es gar nicht gibt. Wozu sollte man das brauchen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350166</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 04 Sep 2013 08:35:47 GMT</pubDate></item></channel></rss>