<?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[Warum ist ein Zeiger auf eine Methode 0x10 byte lang???]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich verstehe den folgenden C++-Code nicht:</p>
<pre><code>#include &lt;stdio.h&gt;

class Foo;

class Bar
{
public:
  typedef void (Foo::*pFooFunc)();
  void RegisterCommand(pFooFunc pFoo) {}
};

// Die folgende Klassendefinition kann auch weggelassen werden
class Foo
{
  void FooFunc() {}
};

int _tmain()
{
  int s = sizeof(Bar::pFooFunc);
  printf(&quot;%d&quot;, s);
  return 0;
}
</code></pre>
<p>Warum ist &quot;sizeof(Bar::pFooFunc)&quot; 0x10 ???<br />
Mach ich die &quot;RegisterCommand&quot; Methode raus, wird sie 0x4 (wie ich eigentlich erwartet habe)...</p>
<p>Hat jemand eine Erklärung dafür?</p>
<p>PS: Compiliert mit VS2003<br />
PPS: Comeau zeigt mir keine Fehler an...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/140496/warum-ist-ein-zeiger-auf-eine-methode-0x10-byte-lang</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 09:41:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/140496.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Mar 2006 11:59:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum ist ein Zeiger auf eine Methode 0x10 byte lang??? on Wed, 15 Mar 2006 12:02:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich verstehe den folgenden C++-Code nicht:</p>
<pre><code>#include &lt;stdio.h&gt;

class Foo;

class Bar
{
public:
  typedef void (Foo::*pFooFunc)();
  void RegisterCommand(pFooFunc pFoo) {}
};

// Die folgende Klassendefinition kann auch weggelassen werden
class Foo
{
  void FooFunc() {}
};

int _tmain()
{
  int s = sizeof(Bar::pFooFunc);
  printf(&quot;%d&quot;, s);
  return 0;
}
</code></pre>
<p>Warum ist &quot;sizeof(Bar::pFooFunc)&quot; 0x10 ???<br />
Mach ich die &quot;RegisterCommand&quot; Methode raus, wird sie 0x4 (wie ich eigentlich erwartet habe)...</p>
<p>Hat jemand eine Erklärung dafür?</p>
<p>PS: Compiliert mit VS2003<br />
PPS: Comeau zeigt mir keine Fehler an...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016625</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Wed, 15 Mar 2006 12:02:09 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist ein Zeiger auf eine Methode 0x10 byte lang??? on Wed, 15 Mar 2006 12:26:38 GMT]]></title><description><![CDATA[<p>Vor einer Weile kam schonmal das Thema &quot;Funktionspointer&quot; auf, da hatte N4C3R einen Link <a href="http://www.codeproject.com/cpp/FastDelegate.asp" rel="nofollow">hierhin</a> gepostet - eventuell hilft dir die dortige Beschreibung auch weiter <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
(Abschnitt &quot;Member Function Pointers - why are they so complex?&quot;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016641</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 15 Mar 2006 12:26:38 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist ein Zeiger auf eine Methode 0x10 byte lang??? on Wed, 15 Mar 2006 12:44:23 GMT]]></title><description><![CDATA[<p>Jochen Kalmbach schrieb:</p>
<blockquote>
<pre><code>#include &lt;stdio.h&gt;

class Foo;

class Bar
{
public:
  /// Die Deklaration von Foo ist noch nicht bekannt (nur ein Forward).
  /// Trotzdem sind Methodenzeiger auf Forward-deklarierte Klassen erlaubt.
  /// In diesem Falle wird virtuelle Vererbung + Mehrfachvererbung
  //// (komplexester Fall) angenommen.
  typedef void (Foo::*pFooFunc)();
  void RegisterCommand(pFooFunc pFoo) {}
};

// Die folgende Klassendefinition kann auch weggelassen werden
class Foo
{
  void FooFunc() {}
};

int _tmain()
{
  int s = sizeof(Bar::pFooFunc);
  printf(&quot;%d&quot;, s);
  return 0;
}
</code></pre>
</blockquote>
<p>Der Link, den CStoll schon wiederholt hat, ist natürlich auch sehr hilfreich. <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>
<p>Edit: Warum die Größe des Zeigers auf 4 schrumpft, wenn du die Methode entfernst, ist mir aber auch nicht wirklich klar. Vielleicht irgendeine Optimierung/Eigenart des Compilers.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016654</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Wed, 15 Mar 2006 12:44:23 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist ein Zeiger auf eine Methode 0x10 byte lang??? on Wed, 15 Mar 2006 12:47:46 GMT]]></title><description><![CDATA[<p>Das ganze ist ja noch schlimmer als gedacht...<br />
Wenn ich den Code in mehrere Dateien splitte (was ja der Normalfall ist), dann führt dies zu einem Speicherüberschreiber... (davon ist in dem Artikel bisher nichts zu lesen):</p>
<p>foo.h:</p>
<pre><code class="language-cpp">#pragma once
class Foo
{
public:
  void FooFunc();
};
</code></pre>
<p>foo.cpp:</p>
<pre><code class="language-cpp">#include &quot;foo.h&quot;

void Foo::FooFunc() {}
</code></pre>
<p>bar.h:</p>
<pre><code class="language-cpp">#pragma once

class Foo;
class Bar
{
public:
  typedef void (Foo::*pFooFunc)();
  void RegisterCommand(pFooFunc pFoo);
};
</code></pre>
<p>bar.cpp:</p>
<pre><code class="language-cpp">#include &quot;bar.h&quot;

void Bar::RegisterCommand(pFooFunc pFoo) {}
</code></pre>
<p>FooBar.cpp:</p>
<pre><code class="language-cpp">#include &quot;Bar.h&quot;
#include &quot;Foo.h&quot;

int wmain()
{
  Bar b;
  b.RegisterCommand(Foo::FooFunc);
}
</code></pre>
<p>Erzeugt bei mir:</p>
<blockquote>
<p>Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.</p>
</blockquote>
<p>Da hier die verschiedenen CPP-Dateien von unterschiedlichen Größen des Methodenzeigers ausgehen...</p>
<p>Ich verzweifle...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016664</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Wed, 15 Mar 2006 12:47:46 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist ein Zeiger auf eine Methode 0x10 byte lang??? on Wed, 15 Mar 2006 12:53:04 GMT]]></title><description><![CDATA[<p>Dazu steht allerdings was in dem Artikel, da gibts neue Compiler-Schlüsselwörter und eine Compiler-Option die das verhindern.</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016668</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Wed, 15 Mar 2006 12:53:04 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist ein Zeiger auf eine Methode 0x10 byte lang??? on Wed, 15 Mar 2006 13:05:44 GMT]]></title><description><![CDATA[<p>SideWinder: Du bist Klasse!!! /vmg behebt das Problem (es geht einfach immer vom schlechtesten Fall aus)!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016679</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Wed, 15 Mar 2006 13:05:44 GMT</pubDate></item></channel></rss>