<?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[Inlinen von Aufrufen virtueller Funktionen]]></title><description><![CDATA[<p>Hallo,</p>
<p>mich würde interessiere, ob Compiler *prinzipiell* fähig sind zu erkennen, dass der Umweg über die VTable überflüssig ist und in einem solchen Fall den Aufruf einer virtuellen Funktion nicht-virtuell gestaltet (und evtl. sogar inlined).</p>
<p>Folgende Situation:</p>
<pre><code class="language-cpp">struct Base {
    virtual std::string f() { return &quot;Base&quot;; }
};

struct Derived : public Base {
    std::string f() { return &quot;Derived&quot;; }
};

int main(int argc, char* argv[])
{
    using namespace std;

    Base* b = new Base();
    Base* d = new Derived();

    cout &lt;&lt; b-&gt;f() &lt;&lt; endl; // *
    cout &lt;&lt; d-&gt;f() &lt;&lt; endl;
}
</code></pre>
<p>Durch eine Flusskontroll-Analyse könnte der Compiler doch feststellen, dass dieses 'b' tatsächlich eine 'Base' zugewiesen bekommt und dass der mit '*' gekennzeichnete Aufruf direkt erfolgen kann und die VTable nicht konsultiert werden muss. Oder?</p>
<p>(Ich weiß, dass einige virtuelle Maschinen (.NET ...) Heuristiken anwenden, um virtuelle Methodenaufrufe zur Laufzeit zu optimieren. Das ist aber nicht dieselbe Situation.)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/165313/inlinen-von-aufrufen-virtueller-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 11:27:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/165313.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Nov 2006 15:58:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Inlinen von Aufrufen virtueller Funktionen on Sat, 18 Nov 2006 15:58:05 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mich würde interessiere, ob Compiler *prinzipiell* fähig sind zu erkennen, dass der Umweg über die VTable überflüssig ist und in einem solchen Fall den Aufruf einer virtuellen Funktion nicht-virtuell gestaltet (und evtl. sogar inlined).</p>
<p>Folgende Situation:</p>
<pre><code class="language-cpp">struct Base {
    virtual std::string f() { return &quot;Base&quot;; }
};

struct Derived : public Base {
    std::string f() { return &quot;Derived&quot;; }
};

int main(int argc, char* argv[])
{
    using namespace std;

    Base* b = new Base();
    Base* d = new Derived();

    cout &lt;&lt; b-&gt;f() &lt;&lt; endl; // *
    cout &lt;&lt; d-&gt;f() &lt;&lt; endl;
}
</code></pre>
<p>Durch eine Flusskontroll-Analyse könnte der Compiler doch feststellen, dass dieses 'b' tatsächlich eine 'Base' zugewiesen bekommt und dass der mit '*' gekennzeichnete Aufruf direkt erfolgen kann und die VTable nicht konsultiert werden muss. Oder?</p>
<p>(Ich weiß, dass einige virtuelle Maschinen (.NET ...) Heuristiken anwenden, um virtuelle Methodenaufrufe zur Laufzeit zu optimieren. Das ist aber nicht dieselbe Situation.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1176670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1176670</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 18 Nov 2006 15:58:05 GMT</pubDate></item><item><title><![CDATA[Reply to Inlinen von Aufrufen virtueller Funktionen on Sat, 18 Nov 2006 17:31:36 GMT]]></title><description><![CDATA[<p>bei zeigern und referenzen ist das nicht möglich<br />
bei normalen instanzen jedoch schon</p>
<p>imho gehört die frage ins compiler-forum und nicht nach c++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1176731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1176731</guid><dc:creator><![CDATA[ronny]]></dc:creator><pubDate>Sat, 18 Nov 2006 17:31:36 GMT</pubDate></item><item><title><![CDATA[Reply to Inlinen von Aufrufen virtueller Funktionen on Sat, 18 Nov 2006 17:38:38 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Durch eine Flusskontroll-Analyse könnte der Compiler doch feststellen, dass dieses 'b' tatsächlich eine 'Base' zugewiesen bekommt und dass der mit '*' gekennzeichnete Aufruf direkt erfolgen kann und die VTable nicht konsultiert werden muss. Oder?</p>
</blockquote>
<p>Dass es prinzipiell möglich ist, hast du dir ja damit schon selbst bewiesen <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1176737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1176737</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sat, 18 Nov 2006 17:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to Inlinen von Aufrufen virtueller Funktionen on Sat, 18 Nov 2006 17:41:20 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Dass es prinzipiell möglich ist, hast du dir ja damit schon selbst bewiesen <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="😉"
    /></p>
</blockquote>
<p>Gut, aber es gibt ja eventuell Hinderungsgründe, z.B. könnte diese Flusskontrolle algorithmisch komplex sein. r0nnys Aussage entnehme ich, dass das nicht gemacht wird und dafür wird es ja sicherlich einen Grund geben. Vielleicht ist die Frage in C++ sowieso falsch gestellt; hier hat man ja die Möglichkeit, auf nicht-virtuelle Funktionen auszuweichen. In anderen Sprachen (Java ...) ist das nicht möglich.</p>
<p>r0nny schrieb:</p>
<blockquote>
<p>imho gehört die frage ins compiler-forum und nicht nach c++</p>
</blockquote>
<p>ACK. Tut mir leid.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1176738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1176738</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 18 Nov 2006 17:41:20 GMT</pubDate></item><item><title><![CDATA[Reply to Inlinen von Aufrufen virtueller Funktionen on Sat, 18 Nov 2006 19:29:23 GMT]]></title><description><![CDATA[<p>es ist nicht komplett unmöglich, nur aufgrund der pointer/referenzsemanik in bezug auf abgeleitete klassen sehr schwirig zu implementieren</p>
<p>da es außerdem nur sehr begrenzt einsetzbar ist, (funktions-lokal) macht es keinen sinn sowas einzuführen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1176798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1176798</guid><dc:creator><![CDATA[ronny]]></dc:creator><pubDate>Sat, 18 Nov 2006 19:29:23 GMT</pubDate></item></channel></rss>