<?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[static inline Funktionstyp]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>ich habe einen Funktionstyp in einer Klasse. Die einer solchen Variablen übergebene Funktion wird innerhalb meiner Klasse aufgerufen. Ich möchte jedoch erzwingen, dass diese Funktion an den Ort des Aufrufs innerhalb der Klasse kopiert wird und kein call gemacht wird.</p>
<p>Inwiefern ist das möglich? (Compiler: MSVC 9.0).</p>
<pre><code class="language-cpp">class Klasse
{
private:
     typedef int (FUNCTION)(void*, void*, void*);

public:
     FUNCTION function;

     void tu_was() 
     {
          for( int i = 0; i &lt; EXTREM OFT; i++ )
               this-&gt;function(NULL, NULL, NULL);
     }
};
</code></pre>
<p>Normalerweise deklariere ich eine Funktion dafür mit &quot;static inline&quot;. Damit der Compiler a) genau weiß wo der Code überall verwendet wird und b) er daher definitiv die Funktion NICHT anlegen muss, sondern immer an den Ort seiner Verwendung kopieren kann.</p>
<p>Ich möchte genau das über den Umweg der Funktionstyp-Variablen erreichen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/255316/static-inline-funktionstyp</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 02:12:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/255316.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 28 Nov 2009 22:40:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static inline Funktionstyp on Sat, 28 Nov 2009 22:40:37 GMT]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>ich habe einen Funktionstyp in einer Klasse. Die einer solchen Variablen übergebene Funktion wird innerhalb meiner Klasse aufgerufen. Ich möchte jedoch erzwingen, dass diese Funktion an den Ort des Aufrufs innerhalb der Klasse kopiert wird und kein call gemacht wird.</p>
<p>Inwiefern ist das möglich? (Compiler: MSVC 9.0).</p>
<pre><code class="language-cpp">class Klasse
{
private:
     typedef int (FUNCTION)(void*, void*, void*);

public:
     FUNCTION function;

     void tu_was() 
     {
          for( int i = 0; i &lt; EXTREM OFT; i++ )
               this-&gt;function(NULL, NULL, NULL);
     }
};
</code></pre>
<p>Normalerweise deklariere ich eine Funktion dafür mit &quot;static inline&quot;. Damit der Compiler a) genau weiß wo der Code überall verwendet wird und b) er daher definitiv die Funktion NICHT anlegen muss, sondern immer an den Ort seiner Verwendung kopieren kann.</p>
<p>Ich möchte genau das über den Umweg der Funktionstyp-Variablen erreichen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814748</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Sat, 28 Nov 2009 22:40:37 GMT</pubDate></item><item><title><![CDATA[Reply to static inline Funktionstyp on Sat, 28 Nov 2009 22:48:53 GMT]]></title><description><![CDATA[<p>Damit kein Aufruf stattfindet und der Code inline gemacht werden kann, muss zur Kompilierzeit klar sein, um welche Funktion es sich handelt. Dadurch, dass du dir die Flexibilität von Funktionszeigern erkaufst (du kannst nacheinander unterschiedliche Funktionen mit dieser Signatur aufrufen und mit dem Funktionszeiger fast wie mit normalen Daten umgehen), ist jene Information möglicherweise erst zur Laufzeit bekannt, was eine Optimierung verhindert.</p>
<p>Allerdings ist der MSVC++-Compiler recht gut im Optimieren. Wenn der Aufruf zur Kompilierzeit einigermassen transparent ist, kann er dies wahrscheinlich erkennen. Ansonsten kannst du einen Funktor nehmen, da bist du allerdings wieder an die statische Natur von Templates gebunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814749</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 28 Nov 2009 22:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to static inline Funktionstyp on Sat, 28 Nov 2009 22:54:33 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Allerdings ist der MSVC++-Compiler recht gut im Optimieren. Wenn der Aufruf zur Kompilierzeit einigermassen transparent ist, kann er dies wahrscheinlich erkennen. Ansonsten kannst du einen Funktor nehmen, da bist du allerdings wieder an die statische Natur von Templates gebunden.</p>
</blockquote>
<p>Danke für deine Antwort. Leider erkennt er dies nicht; dass konnte ich bereits dem Assembly-Listing entnehmen.</p>
<p>Eigentlich muss die Funktion ein einziges mal zugewiesen werden. Ich brauche nicht die Option innerhalb einer Instanz diese Funktion zu wechseln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814751</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Sat, 28 Nov 2009 22:54:33 GMT</pubDate></item><item><title><![CDATA[Reply to static inline Funktionstyp on Sun, 29 Nov 2009 12:24:32 GMT]]></title><description><![CDATA[<p>Dann mach aus deiner Funktion eine template-Funktion...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814911</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sun, 29 Nov 2009 12:24:32 GMT</pubDate></item><item><title><![CDATA[Reply to static inline Funktionstyp on Sun, 29 Nov 2009 13:13:38 GMT]]></title><description><![CDATA[<p>Eine Möglichkeit ist wie gesagt ein Funktor. Dazu machst du deine Klasse zu einem Template, bei dem du den Typ des Funktionsobjekts angeben kannst. Das lohnt sich vor allem, wenn letzteres einen eigenen Status hat; geht es nur um ein bestimmtes Verhalten, kann eine Policy-Klasse sinnvoller sein.</p>
<pre><code class="language-cpp">template &lt;class Function&gt;
class test
{
    public:
        // initialisiere m_func im Konstruktor
        test(/* irgendwas */);

        void do_something()
        {
            m_func(0, 0, 0);
        }

    private:
        Function m_func;
};

struct functor
{
    void operator() (void* a, void* b, void* c) const;
};

test&lt;functor&gt; test_obj;
</code></pre>
<p>Oder du machst es mit einer Policy-Klasse, von der keine Instanz angelegt werden muss. Das kann hier irgendeine Klasse sein, die eine öffentliche statische Memberfunktion mit dem Namen <code>perform_action()</code> und einer kompatiblen Signatur bereitstellt. Dem Klassentemplate <code>test</code> übergibst du dann das gewünschte Verhalten mittels Template-Argument.</p>
<pre><code class="language-cpp">template &lt;class Behaviour&gt;
class test
{
    public:
        void do_something()
        {
            Behaviour::perform_action(0, 0, 0);
        }
};

struct my_behaviour
{
    static void perform_action(void* a, void* b, void* c);
};

test&lt;my_behaviour&gt; test_obj;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1814925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814925</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 29 Nov 2009 13:13:38 GMT</pubDate></item><item><title><![CDATA[Reply to static inline Funktionstyp on Sun, 29 Nov 2009 18:40:24 GMT]]></title><description><![CDATA[<p>Th69 schrieb:</p>
<blockquote>
<p>Dann mach aus deiner Funktion eine template-Funktion...</p>
</blockquote>
<p>Hab ich jetzt auch so gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815093</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Sun, 29 Nov 2009 18:40:24 GMT</pubDate></item><item><title><![CDATA[Reply to static inline Funktionstyp on Sun, 29 Nov 2009 19:06:47 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Hab ich jetzt auch so gemacht.</p>
</blockquote>
<p>Wenn die Instanz über die ganze Zeit die gleiche Funktion aufrufen soll, finde ich ein Klassentemplate sinnvoller als ein Memberfunktionstemplate, da du ansonsten nur die ganze Zeit unnötig Typen angibst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815110</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 29 Nov 2009 19:06:47 GMT</pubDate></item></channel></rss>