<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Huh?</title>
	<atom:link href="http://phresnel.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://phresnel.org/blog</link>
	<description>D&#039;Oh! (feel free to leave me a mail at &#34;phresnel.gmail@com , swap @ with . for proper mail)</description>
	<lastBuildDate>Fri, 12 Feb 2010 09:17:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Yo Mama is C++0x!</title>
		<link>http://phresnel.org/blog/2009/09/yo-mama-is-cpp0x/</link>
		<comments>http://phresnel.org/blog/2009/09/yo-mama-is-cpp0x/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 14:58:32 +0000</pubDate>
		<dc:creator>phresnel</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[C++-Templates]]></category>
		<category><![CDATA[C++0x]]></category>

		<guid isPermaLink="false">http://phresnel.org/blog/?p=117</guid>
		<description><![CDATA[This is a side product of some evil plan to emit hundreds of fixed codepaths at compile time, for the sake of better performance for some simple ifs-fractals-renderer i hack at the moment (itself being an exercise in OpenMP, C++0x (as far as g++4.4 goes), Optimization, and patience of course).

So, what follows is a function [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">This is a side product of some evil plan to emit hundreds of fixed codepaths at compile time, for the sake of better performance for some simple ifs-fractals-renderer i hack at the moment (itself being an exercise in OpenMP, C++0x (as far as g++4.4 goes), Optimization, and patience of course).</p>
<p style="text-align: justify;">
So, what follows is a function that reminds of .net&#8217;s WriteLine()-family, which some say to be a typesafe variant of printf() (yes, the one dreaded for its ellipsis parameter, possibly opening the door to all kinds of vulnerabilities), and hence better. Of course there are iostreams in C++, but they have the disadvantage that you cannot flip arguments around during runtime, making them a non-option for internationalization purposes. You could also overload operators so as to produce typesafe variants of printf(). Anyways, I was snoopy about variadic templates in C++0x. And as it turned out, variadic templates are a bless!</p>
<pre><div id="wpshdo_1" class="wp-synhighlighter-outer"><div id="wpshdt_1" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_1"></a><a id="wpshat_1" class="wp-synhighlighter-title" href="#codesyntax_1"  onClick="javascript:wpsh_toggleBlock(1)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_1" onClick="javascript:wpsh_code(1)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_1" onClick="javascript:wpsh_print(1)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_1" onClick="javascript:wpsh_about(1)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_1" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co2">#include &lt;sstream&gt;</span>
<span class="co2">#include &lt;string&gt;</span>
<span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;stdexcept&gt;</span>
&nbsp;
<span class="co1">// lambdas not yet</span>
<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span> std<span class="sy4">::</span><span class="me2">string</span> to_string <span class="br0">&#40;</span>T val<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        std<span class="sy4">::</span><span class="me2">stringstream</span> ss<span class="sy4">;</span>
        ss <span class="sy1">&lt;&lt;</span> val<span class="sy4">;</span>
        <span class="kw1">return</span> ss.<span class="me1">str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> ...<span class="me1">ARGS</span><span class="sy1">&gt;</span>
<span class="kw4">void</span> write <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">string</span> <span class="kw4">const</span> <span class="sy3">&amp;</span> fmt, ARGS... <span class="me1">args</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw4">const</span> std<span class="sy4">::</span><span class="me2">string</span> argss<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="br0">&#123;</span>to_string <span class="br0">&#40;</span>args<span class="br0">&#41;</span>...<span class="br0">&#125;</span><span class="sy4">;</span> <span class="co1">// &lt;- indeed</span>
        <span class="kw2">enum</span> <span class="br0">&#123;</span>argss_len <span class="sy1">=</span> <span class="kw3">sizeof</span> <span class="br0">&#40;</span>argss<span class="br0">&#41;</span> <span class="sy2">/</span> <span class="kw3">sizeof</span><span class="br0">&#40;</span>argss<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
        <span class="co1">// no range based for loops yet (&quot;for (auto it : fmt)&quot;)</span>
        <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">auto</span> it <span class="sy1">=</span> fmt.<span class="me1">begin</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> it <span class="sy3">!</span><span class="sy1">=</span> fmt.<span class="me1">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="sy2">++</span>it<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy2">*</span>it <span class="sy1">==</span> <span class="st0">'{'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                        <span class="kw4">auto</span> <span class="kw4">const</span> left <span class="sy1">=</span> <span class="sy2">++</span>it<span class="sy4">;</span>
                        <span class="kw1">for</span> <span class="br0">&#40;</span><span class="sy4">;</span> it <span class="sy3">!</span><span class="sy1">=</span> fmt.<span class="me1">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="sy2">++</span>it<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                                <span class="co1">// closing brace: fine</span>
                                <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy2">*</span>it <span class="sy1">==</span> <span class="st0">'}'</span><span class="br0">&#41;</span>
                                        <span class="kw1">break</span><span class="sy4">;</span>
                                <span class="co1">// check if numeric. if not, throw.</span>
                                <span class="kw1">switch</span> <span class="br0">&#40;</span><span class="sy2">*</span>it<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                                <span class="kw1">default</span><span class="sy4">:</span>
                                        <span class="kw1">throw</span> std<span class="sy4">::</span><span class="me2">invalid_argument</span> <span class="br0">&#40;</span>
                                        <span class="st0">&quot;syntax error in format string, &quot;</span>
                                        <span class="st0">&quot;only numeric digits allowed between &quot;</span>
                                        <span class="st0">&quot;braces&quot;</span>
                                        <span class="br0">&#41;</span><span class="sy4">;</span>
                                <span class="kw1">case</span> <span class="st0">'0'</span><span class="sy4">:</span><span class="kw1">case</span> <span class="st0">'1'</span><span class="sy4">:</span><span class="kw1">case</span> <span class="st0">'2'</span><span class="sy4">:</span><span class="kw1">case</span> <span class="st0">'3'</span><span class="sy4">:</span><span class="kw1">case</span> <span class="st0">'4'</span><span class="sy4">:</span>
                                <span class="kw1">case</span> <span class="st0">'5'</span><span class="sy4">:</span><span class="kw1">case</span> <span class="st0">'6'</span><span class="sy4">:</span><span class="kw1">case</span> <span class="st0">'7'</span><span class="sy4">:</span><span class="kw1">case</span> <span class="st0">'8'</span><span class="sy4">:</span><span class="kw1">case</span> <span class="st0">'9'</span><span class="sy4">:;</span>
                                <span class="br0">&#125;</span><span class="sy4">;</span>
                        <span class="br0">&#125;</span>
                        <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy2">*</span>it <span class="sy3">!</span><span class="sy1">=</span> <span class="st0">'}'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                                <span class="kw1">throw</span> std<span class="sy4">::</span><span class="me2">invalid_argument</span> <span class="br0">&#40;</span>
                                        <span class="st0">&quot;syntax error in format string, &quot;</span>
                                        <span class="st0">&quot;missing closing brace&quot;</span>
                                <span class="br0">&#41;</span><span class="sy4">;</span>
                        <span class="br0">&#125;</span>
                        <span class="kw4">auto</span> <span class="kw4">const</span> right <span class="sy1">=</span> it<span class="sy4">;</span>
&nbsp;
                        <span class="kw1">if</span> <span class="br0">&#40;</span>left <span class="sy1">==</span> right<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                                <span class="kw1">throw</span> std<span class="sy4">::</span><span class="me2">invalid_argument</span> <span class="br0">&#40;</span>
                                        <span class="st0">&quot;syntax error in format string, &quot;</span>
                                        <span class="st0">&quot;no index given inside braces&quot;</span>
                                <span class="br0">&#41;</span><span class="sy4">;</span>
                        <span class="br0">&#125;</span>
&nbsp;
                        std<span class="sy4">::</span><span class="me2">stringstream</span> ss<span class="sy4">;</span>
                        ss <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">string</span><span class="br0">&#40;</span>left,right<span class="br0">&#41;</span><span class="sy4">;</span>
                        <span class="kw4">size_t</span> index<span class="sy4">;</span>
                        ss <span class="sy1">&gt;&gt;</span> index<span class="sy4">;</span>
                        <span class="kw1">if</span> <span class="br0">&#40;</span>index <span class="sy1">&gt;=</span> argss_len<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                                <span class="kw1">throw</span> std<span class="sy4">::</span><span class="me2">invalid_argument</span> <span class="br0">&#40;</span>
                                        <span class="st0">&quot;syntax error in format string, &quot;</span>
                                        <span class="st0">&quot;index too big&quot;</span>
                                <span class="br0">&#41;</span><span class="sy4">;</span>
                        <span class="br0">&#125;</span>
                        std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> argss<span class="br0">&#91;</span>index<span class="br0">&#93;</span><span class="sy4">;</span>
                <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
                        std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="sy2">*</span>it<span class="sy4">;</span>
                <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">void</span> write <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">string</span> <span class="kw4">const</span> <span class="sy3">&amp;</span> str<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> str<span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> ...<span class="me1">ARGS</span><span class="sy1">&gt;</span> <span class="kw4">void</span> writeln <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">string</span> <span class="kw4">const</span> <span class="sy3">&amp;</span> fmt, ARGS... <span class="me1">args</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        write <span class="br0">&#40;</span>fmt, args...<span class="br0">&#41;</span><span class="sy4">;</span>
        std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">void</span> writeln <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">string</span> <span class="kw4">const</span> <span class="sy3">&amp;</span> str<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> str <span class="sy1">&lt;&lt;</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div></pre>
<p style="text-align: justify;">You can invoke this function like this (no ofuscation through operator overloading, full typesafety):</p>
<pre><div id="wpshdo_2" class="wp-synhighlighter-outer"><div id="wpshdt_2" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_2"></a><a id="wpshat_2" class="wp-synhighlighter-title" href="#codesyntax_2"  onClick="javascript:wpsh_toggleBlock(2)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_2" onClick="javascript:wpsh_code(2)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_2" onClick="javascript:wpsh_print(2)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_2" onClick="javascript:wpsh_about(2)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_2" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        writeln <span class="br0">&#40;</span><span class="st0">&quot;Test: [{0},{1}]&quot;</span>, 42, 3.14159<span class="br0">&#41;</span><span class="sy4">;</span>
        writeln <span class="br0">&#40;</span><span class="st0">&quot;Test: {1}/{0}!{0}?{0}!!&quot;</span>, <span class="nu0">43</span>, <span class="st0">&quot;hello wurldz&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
        writeln <span class="br0">&#40;</span><span class="st0">&quot;Test: &quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
        <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div></pre>
<p style="text-align: justify;">C++0x will also allow for user defined literals, allowing you to process strings (as in &#8220;strings&#8221;) at compile time, but it has not been scheduled for implementation in GCC as of time of writing.</p>
<p style="text-align: justify;">I initially did some yacking about emitting hundreds of fixed codepaths for performance reasons. Have a look at the following example for a glimpse about how I will do it:</p>
<pre><div id="wpshdo_3" class="wp-synhighlighter-outer"><div id="wpshdt_3" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_3"></a><a id="wpshat_3" class="wp-synhighlighter-title" href="#codesyntax_3"  onClick="javascript:wpsh_toggleBlock(3)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_3" onClick="javascript:wpsh_code(3)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_3" onClick="javascript:wpsh_print(3)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_3" onClick="javascript:wpsh_about(3)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_3" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw2">enum</span> <span class="kw2">class</span> Xtype <span class="br0">&#123;</span>
        add,
        sub,
        yo,
        mama,
        end_
<span class="br0">&#125;</span><span class="sy4">;</span>
<span class="kw2">template</span> <span class="sy1">&lt;</span>Xtype ...<span class="me1">args</span><span class="sy1">&gt;</span> <span class="kw4">struct</span> test<span class="sy4">;</span>
<span class="kw2">template</span> <span class="sy1">&lt;&gt;</span> <span class="kw4">struct</span> test <span class="sy1">&lt;&gt;</span> <span class="br0">&#123;</span>
        <span class="kw4">static</span> <span class="kw4">void</span> exec <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;-term-<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
        <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
<span class="kw2">template</span> <span class="sy1">&lt;</span>Xtype ...<span class="me1">others</span><span class="sy1">&gt;</span> <span class="kw4">struct</span> test<span class="sy1">&lt;</span>Xtype<span class="sy4">::</span><span class="me2">add</span>, others...<span class="sy1">&gt;</span> <span class="br0">&#123;</span>
        <span class="kw4">static</span> <span class="kw4">void</span> exec <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;add<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
                test<span class="sy1">&lt;</span>others...<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
        <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
<span class="kw2">template</span> <span class="sy1">&lt;</span>Xtype ...<span class="me1">others</span><span class="sy1">&gt;</span> <span class="kw4">struct</span> test<span class="sy1">&lt;</span>Xtype<span class="sy4">::</span><span class="me2">sub</span>, others...<span class="sy1">&gt;</span> <span class="br0">&#123;</span>
        <span class="kw4">static</span> <span class="kw4">void</span> exec <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;sub<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
                test<span class="sy1">&lt;</span>others...<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
        <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
<span class="kw2">template</span> <span class="sy1">&lt;</span>Xtype ...<span class="me1">others</span><span class="sy1">&gt;</span> <span class="kw4">struct</span> test<span class="sy1">&lt;</span>Xtype<span class="sy4">::</span><span class="me2">yo</span>, others...<span class="sy1">&gt;</span> <span class="br0">&#123;</span>
        <span class="kw4">static</span> <span class="kw4">void</span> exec <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;yo<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
                test<span class="sy1">&lt;</span>others...<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
        <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
<span class="kw2">template</span> <span class="sy1">&lt;</span>Xtype ...<span class="me1">others</span><span class="sy1">&gt;</span> <span class="kw4">struct</span> test<span class="sy1">&lt;</span>Xtype<span class="sy4">::</span><span class="me2">mama</span>, others...<span class="sy1">&gt;</span> <span class="br0">&#123;</span>
        <span class="kw4">static</span> <span class="kw4">void</span> exec <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;mama<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
                test<span class="sy1">&lt;</span>others...<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
        <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        test<span class="sy1">&lt;</span>
                Xtype<span class="sy4">::</span><span class="me2">add</span>,
                Xtype<span class="sy4">::</span><span class="me2">add</span>,
                Xtype<span class="sy4">::</span><span class="me2">sub</span>,
                Xtype<span class="sy4">::</span><span class="me2">sub</span>,
                Xtype<span class="sy4">::</span><span class="me2">add</span>,
                Xtype<span class="sy4">::</span><span class="me2">add</span>,
                Xtype<span class="sy4">::</span><span class="me2">sub</span>,
                Xtype<span class="sy4">::</span><span class="me2">yo</span>,
                Xtype<span class="sy4">::</span><span class="me2">mama</span>,
                Xtype<span class="sy4">::</span><span class="me2">yo</span>,
                Xtype<span class="sy4">::</span><span class="me2">mama</span>,
                Xtype<span class="sy4">::</span><span class="me2">yo</span>,
                Xtype<span class="sy4">::</span><span class="me2">yo</span>
        <span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
        <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div></pre>
<p>Output:</p>
<dl class="codebox">
<dd><code>add<br />
add<br />
sub<br />
sub<br />
add<br />
add<br />
sub<br />
yo<br />
mama<br />
yo<br />
mama<br />
yo<br />
yo<br />
-term-</code></dd>
</dl>
<p style="text-align: justify;">No more need for clumsy nesting or for std::tuple (surely std::tuple itself largely profits from variadic templates; for the curious: the boost implementation of tuple is essentially a template with a plethora of parameters (<a title="http://www.boost.org/doc/libs/1_40_0/libs/tuple/doc/tuple_users_guide.html" href="http://www.boost.org/doc/libs/1_40_0/libs/tuple/doc/tuple_users_guide.html">http://www.boost.org/doc/libs/1_40_0/libs/tuple/doc/tuple_users_guide.html</a>).</p>
<p style="text-align: justify;">Btw, the status of implementation of C++0x in GCC is at <a title="http://gcc.gnu.org/projects/cxx0x.html" href="http://gcc.gnu.org/projects/cxx0x.html">http://gcc.gnu.org/projects/cxx0x.html</a>, the implementation status of the updated standard library is at <a title="http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x" href="http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x">http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x</a>.</p>
<p style="text-align: justify;">If you are snoopy yourself, invoke g++ with -std=c++0x (all lowercase!).</p>
]]></content:encoded>
			<wfw:commentRss>http://phresnel.org/blog/2009/09/yo-mama-is-cpp0x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>This (-&gt;) is not only a matter of style.</title>
		<link>http://phresnel.org/blog/2009/04/this-is-not-only-a-matter-of-style/</link>
		<comments>http://phresnel.org/blog/2009/04/this-is-not-only-a-matter-of-style/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 17:10:35 +0000</pubDate>
		<dc:creator>phresnel</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[C++-Templates]]></category>
		<category><![CDATA[gamedev.net]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://phresnel.org/blog/?p=99</guid>
		<description><![CDATA[Quote:



Original post by Saruman

Quote:



Original post by caldiar
What I&#8217;m doing wouldn&#8217;t happen to be using that hidden this pointer I keep reading about would it?






That is exactly what you are doing by using this-&#62;function2() although you don&#8217;t need it at all. In C++ this-&#62; is implied when calling member functions.
There is really zero reason you would [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><span class="smallfont">Quote:</span></p>
<table border="0" cellspacing="0" cellpadding="4" width="95%">
<tbody>
<tr>
<td class="quote"><!--/QUOTE--><!--STARTQUOTE--><em>Original post by Saruman</em><br />
<!--QUOTE--></p>
<blockquote><p><span class="smallfont">Quote:</span></p>
<table border="0" cellspacing="0" cellpadding="4" width="95%">
<tbody>
<tr>
<td class="quote"><!--/QUOTE--><!--STARTQUOTE--><em>Original post by caldiar</em><br />
What I&#8217;m doing wouldn&#8217;t happen to be using that hidden this pointer I keep reading about would it?<br />
<!--QUOTE--></td>
</tr>
</tbody>
</table>
</blockquote>
<p><!--/QUOTE--><!--ENDQUOTE--><br />
That is exactly what you are doing by using this-&gt;function2() although you don&#8217;t need it at all. In C++ this-&gt; is implied when calling member functions.</p>
<p>There is really zero reason you would ever do that in front of a function, but some people use this-&gt; before member variables in order to avoid code warts. (i.e. instead of naming member variables something like: m_myVariable they will use this-&gt;myVariable)<!--QUOTE--></td>
</tr>
</tbody>
</table>
</blockquote>
<p><!--/QUOTE--><!--ENDQUOTE--></p>
<p>Using this-&gt; is actually a good practice if you write templates.</p>
<p>Consider the following example:</p>
<p><!--STARTSCRIPT--><!--source lang="cpp"--></p>
<div class="source">
<pre><div id="wpshdo_4" class="wp-synhighlighter-outer"><div id="wpshdt_4" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_4"></a><a id="wpshat_4" class="wp-synhighlighter-title" href="#codesyntax_4"  onClick="javascript:wpsh_toggleBlock(4)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_4" onClick="javascript:wpsh_code(4)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_4" onClick="javascript:wpsh_print(4)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_4" onClick="javascript:wpsh_about(4)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_4" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co2">#include &lt;iostream&gt;</span>
&nbsp;
<span class="kw4">void</span> vfun<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;::vfun()n&quot;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span> <span class="kw4">struct</span> X <span class="br0">&#123;</span>
        <span class="kw2">virtual</span> <span class="kw4">void</span> vfun<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;X::vfun()n&quot;</span><span class="sy4">;</span> <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span> <span class="kw4">struct</span> Y <span class="sy4">:</span> <span class="kw2">public</span> X<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="br0">&#123;</span>
        <span class="kw4">void</span> fun <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> vfun<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span> <span class="kw4">struct</span> Z <span class="sy4">:</span> Y<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="br0">&#123;</span>
        <span class="kw2">virtual</span> <span class="kw4">void</span> vfun<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Z::vfun()n&quot;</span><span class="sy4">;</span> <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw4">int</span> main <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        Z<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> z<span class="sy4">;</span>
        z.<span class="me1">fun</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
        std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">flush</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div></pre>
</div>
<p><!--ENDSCRIPT--></p>
<p><em>Remember</em> that templates are parsed two times: One time the template definition itself is parsed, so errors in the template itself can be found, and another time upon instantiation, so errors resulting from specialisations can be found (early C++ compilers implemented templates more like ordinary #define macros; but we know how hard finding bugs can be that way). <em>Also, </em><strong>only</strong><em> during the second phase, &#8220;templated&#8221; base classes can be looked up.</em></p>
<p>At first, a global function <em>vfun()</em> is defined. Nothing special. Then, a class template <em>X&lt;T&gt;</em> is defined. <em>X</em> defines a virtual function &#8220;vfun()&#8221;.</p>
<p>Another class template <em>Y&lt;T&gt;</em> is then defined, which derives from <em>X&lt;Y&gt;</em>, but it does not re-implement the virtual function <em>X::vfun()</em>. No problem yet. <em>Y&lt;T&gt;</em> also defines a member function, named <em>fun()</em>, which itself calls <em>vfun()</em>. (There&#8217;s a third class template, struct Z&lt;T&gt;, but we ignore it for now.)</p>
<p>Here&#8217;s struct Y again:</p>
<p><!--STARTSCRIPT--><!--source lang="cpp"--></p>
<div class="source">
<pre><div id="wpshdo_5" class="wp-synhighlighter-outer"><div id="wpshdt_5" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_5"></a><a id="wpshat_5" class="wp-synhighlighter-title" href="#codesyntax_5"  onClick="javascript:wpsh_toggleBlock(5)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_5" onClick="javascript:wpsh_code(5)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_5" onClick="javascript:wpsh_print(5)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_5" onClick="javascript:wpsh_about(5)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_5" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span> <span class="kw4">struct</span> Y <span class="sy4">:</span> <span class="kw2">public</span> X<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="br0">&#123;</span>
        <span class="kw4">void</span> fun <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> vfun<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span></pre></div></div></pre>
</div>
<p><!--ENDSCRIPT--></p>
<p>The problem now is, that the call to <em>vfun()</em> is unqualified (no ::vfun() or Y&lt;X&gt;::vfun(), just the pure function name). Furthermore, the arguments you pass to it don&#8217;t depend on a template parameter (in this example, we are actually passing no argument at all). Thus, the call doesn&#8217;t qualify for <a href="http://en.wikipedia.org/wiki/Argument_dependent_lookup">Argument Dependent Lookup</a> (ADL).</p>
<p>You would now think, &#8220;why does the compiler not just lookup the baseclass?&#8221;. The answer lies in possible side effects due to explicit or partial specialisations (which can legally occur <em>everywhere</em> in the code), which basically means that e.g. a template specialisation X&lt;bool&gt; could be defined in a completely different way than X&lt;float&gt;, e.g. X&lt;bool&gt; could define &#8220;enum { pipapo = 0 };&#8221;, whereas X&lt;float&gt; could  define pipapo as &#8220;typedef X pipapo;&#8221;.</p>
<p>So, what remains is to use <strong>ordinary lookup</strong> of non-dependent names <em>only</em>, which is approximately the type of lookup you would have in a C program,  because during the second parse, only <em>ADL</em> and lookup of dependent names occur.</p>
<h2>Explicitly qualifying the call to vfun()</h2>
<p>If there wouldn&#8217;t be a <em>global</em> vfun() (just try yourself), standards compliant compilation should trigger an error about a call to an undeclared function. But <em>with</em> the global vfun(), the compiler happily finds it unambiguously using ordinary lookup. Thus, instead of calling the base classes&#8217; virtual member function &#8220;vfun()&#8221;, Y&lt;T&gt;::fun() will call the global one.</p>
<p>A solution to this is to <strong>qualify</strong> the name:</p>
<p><!--STARTSCRIPT--><!--source lang="cpp"--></p>
<div class="source">
<pre><span class="cpp-keyword"><div id="wpshdo_6" class="wp-synhighlighter-outer"><div id="wpshdt_6" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_6"></a><a id="wpshat_6" class="wp-synhighlighter-title" href="#codesyntax_6"  onClick="javascript:wpsh_toggleBlock(6)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_6" onClick="javascript:wpsh_code(6)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_6" onClick="javascript:wpsh_print(6)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_6" onClick="javascript:wpsh_about(6)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_6" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span> <span class="kw4">struct</span> Y <span class="sy4">:</span> <span class="kw2">public</span> X<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="br0">&#123;</span>
        <span class="kw4">void</span> fun <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> X<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">vfun</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span></pre></div></div></span></pre>
</div>
<p><!--ENDSCRIPT--></p>
<p>Now, the correct function gets called, because we made the call dependent upon a template parameter, so that name-lookup is delayed until the second phase.</p>
<h2>We just inhibited the virtual function call mechanism</h2>
<p>But still, we have a problem if another class derives from Y&lt;&gt; and overrides vfun(). Here, our previously ignored struct Z&lt;T&gt; comes into play:</p>
<p><!--STARTSCRIPT--><!--source lang="cpp"--></p>
<div class="source">
<pre><span class="cpp-keyword"><div id="wpshdo_7" class="wp-synhighlighter-outer"><div id="wpshdt_7" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_7"></a><a id="wpshat_7" class="wp-synhighlighter-title" href="#codesyntax_7"  onClick="javascript:wpsh_toggleBlock(7)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_7" onClick="javascript:wpsh_code(7)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_7" onClick="javascript:wpsh_print(7)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_7" onClick="javascript:wpsh_about(7)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_7" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span> <span class="kw4">struct</span> Z <span class="sy4">:</span> Y<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="br0">&#123;</span>
        <span class="kw2">virtual</span> <span class="kw4">void</span> vfun<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Z::vfun()n&quot;</span><span class="sy4">;</span> <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span></pre></div></div></pre>
</div>
<p><!--ENDSCRIPT--></p>
<p>Note that Z&lt;T&gt; also derives fun() from Y&lt;T&gt;, our previous &#8220;problem&#8221; function. But in &#8220;Y&lt;T&gt;::fun()&#8221;, we <strong>qualified</strong> the call to vfun() with X&lt;T&gt;::vfun(), which unfortunately means that we inhibited virtual function calling rules, and have fallen back to a non-virtual call. So, if we now call Z&lt;T&gt;::vfun()<em> through a pointer or reference to struct X</em>, we really call X&lt;T&gt;::vfun(), and not the overriden version in Z&lt;T&gt;.</p>
<p>While this might have been intentional, what if you really want to call the <em>most derived</em> vfun() inside fun(), instead of calling the <em>least derived</em> version? How can me make the virtual call <em>dependent</em> on a template parameter so that lookup can be delayed to the second phase of template parsing?, without interfering with any derivation rules?</p>
<h2>this-&gt; is the solution</h2>
<p>Consider that the this-&gt; pointer itself is a dependent name inside a class template, as its type is only completely determined once the template is intantiated (<em>-&gt; lookup delayed to <strong>second phase</strong></em>). So the simple solution to our not too obvious problem is, when writing a template, to use this-&gt; whenever possible (*).</p>
<p>Here is our modified example:</p>
<p><!--STARTSCRIPT--><!--source lang="cpp"--></p>
<div class="source">
<pre><span class="cpp-keyword"><div id="wpshdo_8" class="wp-synhighlighter-outer"><div id="wpshdt_8" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_8"></a><a id="wpshat_8" class="wp-synhighlighter-title" href="#codesyntax_8"  onClick="javascript:wpsh_toggleBlock(8)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_8" onClick="javascript:wpsh_code(8)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_8" onClick="javascript:wpsh_print(8)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_8" onClick="javascript:wpsh_about(8)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_8" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span> <span class="kw4">struct</span> Y <span class="sy4">:</span> <span class="kw2">public</span> X<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="br0">&#123;</span>
        <span class="kw4">void</span> fun <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>vfun<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span></pre></div></div></pre>
</div>
<p><!--ENDSCRIPT--></p>
<p>So, actually, using &#8220;this-&gt;&#8221; whenever possible is good style when writing templates. It is not needed in case of an explicit specialisation (**), because an explicit specialisation is basically the same as an ordinary non-template class or function, where each entity can be looked up upon the first parse (in an explicit specialisation, this-&gt; is non-dependent, so we could not even direct the lookup until a second phase as all non-dependent names are only looked up in the first phase; despite that no second phase exists for explicit specialisations (***)).</p>
<h2>Footnotes</h2>
<p><strong>(*)</strong> Except, of course, in the case where we are really interested in a very specific entity, like the global vfun() in our example.</p>
<p><strong>(**)</strong> If you would write the following specialisation, this-&gt; can be ommitted, as the compiler can fully instantiate X&lt;int&gt; and Y&lt;int&gt;, and thus find the virtual member function vfun().</p>
<p><!--STARTSCRIPT--><!--source lang="cpp"--></p>
<div class="source">
<pre><span class="cpp-keyword"><div id="wpshdo_9" class="wp-synhighlighter-outer"><div id="wpshdt_9" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_9"></a><a id="wpshat_9" class="wp-synhighlighter-title" href="#codesyntax_9"  onClick="javascript:wpsh_toggleBlock(9)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_9" onClick="javascript:wpsh_code(9)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_9" onClick="javascript:wpsh_print(9)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_9" onClick="javascript:wpsh_about(9)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_9" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw2">template</span> <span class="sy1">&lt;&gt;</span> <span class="kw4">struct</span> Y<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> <span class="sy4">:</span> X<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> <span class="br0">&#123;</span>
        <span class="kw4">void</span> fun <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> vfun<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="br0">&#125;</span> <span class="co1">// Will call the virtual</span>
                                <span class="co1">// function, not the global one.</span>
<span class="br0">&#125;</span><span class="sy4">;</span></pre></div></div></pre>
</div>
<p><!--ENDSCRIPT--><strong>(***)</strong> Though a <em>partial</em> specialisation still contains dependent names, and all of the said still applies.</p>
<h2>Appendix</h2>
<p>In an answer to Hummm below, I&#8217;ve mashed up the following snippet for you to play with. It has some explanations; just don&#8217;t forget about two-phase lookup:</p>
<pre><div id="wpshdo_10" class="wp-synhighlighter-outer"><div id="wpshdt_10" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_10"></a><a id="wpshat_10" class="wp-synhighlighter-title" href="#codesyntax_10"  onClick="javascript:wpsh_toggleBlock(10)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_10" onClick="javascript:wpsh_code(10)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_10" onClick="javascript:wpsh_print(10)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_10" onClick="javascript:wpsh_about(10)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_10" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co2">#include &lt;iostream&gt;</span>
<span class="kw4">void</span> vfun<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;::vfun()<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span> <span class="kw4">struct</span> X <span class="br0">&#123;</span>
        <span class="kw2">virtual</span> <span class="kw4">void</span> vfun<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;X::vfun()<span class="es1">\n</span>&quot;</span><span class="sy4">;</span> <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span> <span class="kw4">struct</span> Y <span class="sy4">:</span> <span class="kw2">public</span> X<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="br0">&#123;</span>
        <span class="co1">// During compilation, only the global vfun()</span>
        <span class="co1">// is visible, so this will call ::vfun().</span>
        <span class="kw4">void</span> fun0 <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> vfun<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="br0">&#125;</span>
&nbsp;
        <span class="co1">// This will explitily call X::vfun()</span>
        <span class="co1">// and inhibit virtual function dispatch.</span>
        <span class="kw4">void</span> fun1 <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> X<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">vfun</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="br0">&#125;</span>
&nbsp;
        <span class="co1">// Qualifying the call with this makes the call</span>
        <span class="co1">// to vfun() &quot;dependent&quot;, as the type of 'this'</span>
        <span class="co1">// depends on X&lt;T&gt;, which is not yet known.</span>
        <span class="co1">// Thus, the compiler will postpone</span>
        <span class="co1">// name-lookup until Phase 2 of template parsing.</span>
        <span class="kw4">void</span> fun2 <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>vfun<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span> <span class="kw4">struct</span> Z <span class="sy4">:</span> Y<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="br0">&#123;</span>
       <span class="kw2">virtual</span> <span class="kw4">void</span> vfun<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Z::vfun()<span class="es1">\n</span>&quot;</span><span class="sy4">;</span> <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw4">int</span> main <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        Z<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> z<span class="sy4">;</span>
        z.<span class="me1">fun0</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
        z.<span class="me1">fun1</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
        z.<span class="me1">fun2</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
        std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">flush</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div></pre>
<h2>References</h2>
<ul>
<li>http://en.wikipedia.org: <a href="http://en.wikipedia.org/wiki/Argument_dependent_lookup">Argument Dependent Lookup</a></li>
<li>http://ibm.com: <a href="http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=/com.ibm.vacpp6m.doc/language/ref/clrc11cplr315.htm">Overload Resolution</a></li>
<li>Vandevoorde/Josuttis: <a href="http://books.google.de/books?id=EotSAwuBkJoC&amp;pg=PA127">9.3: Parsing Templates</a></li>
</ul>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 2388px; width: 1px; height: 1px;">
<pre></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://phresnel.org/blog/2009/04/this-is-not-only-a-matter-of-style/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Virtual Functions Considered Not Harmful, Part II</title>
		<link>http://phresnel.org/blog/2009/02/virtual-functions-considered-not-harmful-part-ii/</link>
		<comments>http://phresnel.org/blog/2009/02/virtual-functions-considered-not-harmful-part-ii/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 13:40:01 +0000</pubDate>
		<dc:creator>phresnel</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[debunk]]></category>
		<category><![CDATA[gamedev.net]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[optimization]]></category>

		<guid isPermaLink="false">http://phresnel.org/blog/?p=58</guid>
		<description><![CDATA[
For the lack of a profiler (and for the lack of time), I commited to the cardinal sin of making unproven statements in Virtual Functions Considered Not Harmful, Part I &#8230;






Original post by dascandy
call	*%eax
&#60;snip&#62;
call	__ZNK3Bar4fun2Eii
The first causes (often) a pipeline stall. The second never does. Please try to *profile* your speed tests before making any statements. [...]]]></description>
			<content:encoded><![CDATA[<p><!--QUOTE--></p>
<p>For the lack of a profiler (and for the lack of time), I commited to the cardinal sin of making unproven statements in <em>Virtual Functions Considered Not Harmful, Part I </em>&#8230;</p>
<p><span class="smallfont"><br />
</span></p>
<blockquote>
<table border="0" cellspacing="0" cellpadding="4" width="95%">
<tbody>
<tr>
<td class="quote"><!--/QUOTE--><!--STARTQUOTE--><em>Original post by dascandy</em><br />
call	*%eax</p>
<p>&lt;snip&gt;</p>
<p>call	__ZNK3Bar4fun2Eii</p>
<p>The first causes (often) a pipeline stall. The second never does. Please try to *profile* your speed tests before making any statements. You&#8217;re not working on 386&#8217;s, 486&#8217;s or Pentiums, your CPU is not trivial anymore.<!--QUOTE--></td>
</tr>
</tbody>
</table>
</blockquote>
<p><!--/QUOTE--><!--ENDQUOTE--><!--QUOTE--><!--/QUOTE--><!--ENDQUOTE--><br />
The key concepts here are the <a href="http://en.wikipedia.org/wiki/Branch_predictor">Branch History Table</a> (as in <em>&#8220;your CPU is not trivial anymore&#8221;</em> [sic!]) on modern CPU and the fact that the advantage of non-virtual functions decreases with increasing complexity of the function itself.</p>
<p>You are right, I should have used a profiler, but unfortunately, I don&#8217;t have one handy on this box. Hence I wrote the following benchmark (mostly Std-C++ compatible, except for the asm()&#8217;s  and the __attribute(())&#8217;s for the sake of benchmarking).</p>
<h2>Benchmark</h2>
<p>I tried to be as careful as possible, if I have done something bogus, please let me know. So, here it is:</p>
<div class="source">
<pre><span class="cpp-directive"><div id="wpshdo_11" class="wp-synhighlighter-outer"><div id="wpshdt_11" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_11"></a><a id="wpshat_11" class="wp-synhighlighter-title" href="#codesyntax_11"  onClick="javascript:wpsh_toggleBlock(11)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_11" onClick="javascript:wpsh_code(11)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_11" onClick="javascript:wpsh_print(11)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_11" onClick="javascript:wpsh_about(11)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_11" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co2">#ifdef __GNUC__</span>
<span class="co2">#define MARK(x) do{asm volatile (&quot;# &quot;#x);}while(0)</span>
<span class="co2">#define NO_OPTIMIZE_AWAY() do{asm(&quot;&quot;);}while(0)</span>
<span class="co2">#else</span>
<span class="co2">#error &quot;dies&quot;</span>
<span class="co2">#endif</span>
&nbsp;
<span class="co2">#include &lt;ctime&gt;</span>
<span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;cmath&gt;</span>
&nbsp;
<span class="kw4">struct</span> StaticNoInline <span class="br0">&#123;</span>
    <span class="kw4">float</span> dist <span class="br0">&#40;</span><span class="kw4">float</span> <span class="kw4">const</span> <span class="kw4">volatile</span> <span class="sy2">*</span>lhs, <span class="kw4">float</span> <span class="kw4">const</span> <span class="kw4">volatile</span> <span class="sy2">*</span>rhs<span class="br0">&#41;</span>
     __attribute__<span class="br0">&#40;</span><span class="br0">&#40;</span>noinline<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw4">float</span> <span class="kw4">const</span> diff <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="br0">&#123;</span>
            rhs <span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy2">-</span> lhs <span class="br0">&#91;</span>0<span class="br0">&#93;</span>,
            rhs <span class="br0">&#91;</span>1<span class="br0">&#93;</span> <span class="sy2">-</span> lhs <span class="br0">&#91;</span>1<span class="br0">&#93;</span>,
            rhs <span class="br0">&#91;</span>2<span class="br0">&#93;</span> <span class="sy2">-</span> lhs <span class="br0">&#91;</span>2<span class="br0">&#93;</span>,
        <span class="br0">&#125;</span><span class="sy4">;</span>
        <span class="kw4">float</span> <span class="kw4">const</span> lenSq <span class="sy1">=</span> diff <span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy2">*</span>diff <span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy2">+</span> diff <span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="sy2">*</span>diff <span class="br0">&#91;</span>1<span class="br0">&#93;</span>
                                                <span class="sy2">+</span> diff <span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy2">*</span>diff <span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy4">;</span>
        <span class="kw1">return</span> <span class="kw3">sqrt</span> <span class="br0">&#40;</span>lenSq<span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw4">struct</span> StaticForceInline <span class="br0">&#123;</span>
    <span class="kw4">float</span> dist <span class="br0">&#40;</span><span class="kw4">float</span> <span class="kw4">const</span> <span class="kw4">volatile</span> <span class="sy2">*</span>lhs, <span class="kw4">float</span> <span class="kw4">const</span> <span class="kw4">volatile</span> <span class="sy2">*</span>rhs<span class="br0">&#41;</span>
     __attribute__<span class="br0">&#40;</span><span class="br0">&#40;</span>forceinline<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw4">float</span> <span class="kw4">const</span> diff <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="br0">&#123;</span>
            rhs <span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy2">-</span> lhs <span class="br0">&#91;</span>0<span class="br0">&#93;</span>,
            rhs <span class="br0">&#91;</span>1<span class="br0">&#93;</span> <span class="sy2">-</span> lhs <span class="br0">&#91;</span>1<span class="br0">&#93;</span>,
            rhs <span class="br0">&#91;</span>2<span class="br0">&#93;</span> <span class="sy2">-</span> lhs <span class="br0">&#91;</span>2<span class="br0">&#93;</span>,
        <span class="br0">&#125;</span><span class="sy4">;</span>
        <span class="kw4">float</span> <span class="kw4">const</span> lenSq <span class="sy1">=</span> diff <span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy2">*</span>diff <span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy2">+</span> diff <span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="sy2">*</span>diff <span class="br0">&#91;</span>1<span class="br0">&#93;</span>
                                                <span class="sy2">+</span> diff <span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy2">*</span>diff <span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy4">;</span>
        <span class="kw1">return</span> <span class="kw3">sqrt</span> <span class="br0">&#40;</span>lenSq<span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw4">struct</span> IVirtual <span class="br0">&#123;</span>
    <span class="kw2">virtual</span> <span class="kw4">float</span> dist <span class="br0">&#40;</span><span class="kw4">float</span> <span class="kw4">const</span> <span class="kw4">volatile</span> <span class="sy2">*</span>lhs, <span class="kw4">float</span> <span class="kw4">const</span> <span class="kw4">volatile</span> <span class="sy2">*</span>rhs<span class="br0">&#41;</span>
        __attribute__<span class="br0">&#40;</span><span class="br0">&#40;</span>noinline<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw4">struct</span> Virtual <span class="sy4">:</span> <span class="kw2">public</span> IVirtual <span class="br0">&#123;</span>
    <span class="kw4">float</span> dist <span class="br0">&#40;</span><span class="kw4">float</span> <span class="kw4">const</span> <span class="kw4">volatile</span> <span class="sy2">*</span>lhs, <span class="kw4">float</span> <span class="kw4">const</span> <span class="kw4">volatile</span> <span class="sy2">*</span>rhs<span class="br0">&#41;</span>
     __attribute__<span class="br0">&#40;</span><span class="br0">&#40;</span>noinline<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw4">float</span> <span class="kw4">const</span> diff <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="br0">&#123;</span>
            rhs <span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy2">-</span> lhs <span class="br0">&#91;</span>0<span class="br0">&#93;</span>,
            rhs <span class="br0">&#91;</span>1<span class="br0">&#93;</span> <span class="sy2">-</span> lhs <span class="br0">&#91;</span>1<span class="br0">&#93;</span>,
            rhs <span class="br0">&#91;</span>2<span class="br0">&#93;</span> <span class="sy2">-</span> lhs <span class="br0">&#91;</span>2<span class="br0">&#93;</span>,
        <span class="br0">&#125;</span><span class="sy4">;</span>
        <span class="kw4">float</span> <span class="kw4">const</span> lenSq <span class="sy1">=</span> diff <span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy2">*</span>diff <span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy2">+</span> diff <span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="sy2">*</span>diff <span class="br0">&#91;</span>1<span class="br0">&#93;</span>
                                                <span class="sy2">+</span> diff <span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy2">*</span>diff <span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy4">;</span>
        <span class="kw1">return</span> <span class="kw3">sqrt</span> <span class="br0">&#40;</span>lenSq<span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T, <span class="kw2">typename</span> I, uint32_t count<span class="sy1">&gt;</span>
<span class="kw4">void</span> test <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw4">static</span> <span class="kw4">volatile</span> <span class="kw4">float</span> dist<span class="sy4">;</span>
    <span class="kw4">static</span> <span class="kw4">volatile</span> <span class="kw4">float</span> lhs <span class="br0">&#91;</span>3<span class="br0">&#93;</span><span class="sy4">;</span>
    <span class="kw4">static</span> <span class="kw4">volatile</span> <span class="kw4">float</span> rhs <span class="br0">&#91;</span>3<span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp;
    <span class="sy4">::</span><span class="me2">std</span><span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Beginning test for &quot;</span> <span class="sy1">&lt;&lt;</span> <span class="kw2">typeid</span> <span class="br0">&#40;</span>T<span class="br0">&#41;</span>.<span class="me1">name</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
                <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;, count is &quot;</span> <span class="sy1">&lt;&lt;</span> count
                <span class="sy1">&lt;&lt;</span> <span class="st0">'n'</span><span class="sy4">;</span>
&nbsp;
    I <span class="sy3">&amp;</span>subject <span class="sy1">=</span> <span class="sy2">*</span><span class="kw3">new</span> T <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw4">clock_t</span> <span class="kw4">const</span> beginT <span class="sy1">=</span> <span class="kw3">clock</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    MARK<span class="br0">&#40;</span><span class="st0">&quot;entering loop&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw1">for</span> <span class="br0">&#40;</span>uint32_t i<span class="sy1">=</span><span class="nu0">0</span><span class="sy4">;</span> i<span class="sy1">&lt;</span>count<span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        dist <span class="sy1">=</span> subject.<span class="me1">dist</span> <span class="br0">&#40;</span>lhs, rhs<span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="br0">&#125;</span>
    MARK<span class="br0">&#40;</span><span class="st0">&quot;left loop&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw4">clock_t</span> <span class="kw4">const</span> endT <span class="sy1">=</span> <span class="kw3">clock</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw3">delete</span> <span class="sy3">&amp;</span>subject<span class="sy4">;</span>
    <span class="sy4">::</span><span class="me2">std</span><span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Test ended, total time &quot;</span> <span class="sy1">&lt;&lt;</span> endT <span class="sy2">-</span> beginT <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;msec.n&quot;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">int</span> main <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw4">const</span> uint32_t count <span class="sy1">=</span> 1<span class="sy1">&lt;&lt;</span><span class="nu0">27</span><span class="sy4">;</span>
    test<span class="sy1">&lt;</span>Virtual, IVirtual, count<span class="sy1">&gt;</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    test<span class="sy1">&lt;</span>StaticNoInline, StaticNoInline, count<span class="sy1">&gt;</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    test<span class="sy1">&lt;</span>StaticForceInline, StaticForceInline, count<span class="sy1">&gt;</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="co1">// Re-execute to take care of CPU heat and priority switches</span>
    test<span class="sy1">&lt;</span>Virtual, IVirtual, count<span class="sy1">&gt;</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    test<span class="sy1">&lt;</span>StaticNoInline, StaticNoInline, count<span class="sy1">&gt;</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    test<span class="sy1">&lt;</span>StaticForceInline, StaticForceInline, count<span class="sy1">&gt;</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="sy4">::</span><span class="me2">std</span><span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="sy4">::</span><span class="me2">std</span><span class="sy4">::</span><span class="me2">flush</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div></pre>
<p>Basically, this benchmark calculates many million vector3-lengths.</p></div>
<p><!--ENDSCRIPT--></p>
<h2>Results</h2>
<p>On a Pentium(R) M, 1.8GHz, the program gives me <em>really</em> debunking numbers.</p>
<h3>stdout of benchmark</h3>
<pre>  Beginning test for 7Virtual, count is 134217728
  Test ended, total time 5828msec.
  Beginning test for 14StaticNoInline, count is 134217728
  Test ended, total time 5839msec.
  Beginning test for 17StaticForceInline, count is 134217728
  Test ended, total time 5118msec.
  Beginning test for 7Virtual, count is 134217728
  Test ended, total time 5798msec.
  Beginning test for 14StaticNoInline, count is 134217728
  Test ended, total time 5809msec.
  Beginning test for 17StaticForceInline, count is 134217728
  Test ended, total time 5097msec.</pre>
<h3>interpretation</h3>
<p>clock() is not too exact (especially on Windows(R)), so I ran it for over 5 seconds (134,217,728 loops). In more readable form, the results are:</p>
<ul>
<li><strong>virtual</strong>: 5.828 sec, 5.798 sec = <strong>5.813 sec</strong> on average</li>
<li><strong>static, <em>not inlined</em></strong>: 5.839 sec, 5.809 sec = <strong>5.824 sec</strong> on average</li>
<li><strong>static, <em>inlined</em></strong>: 5.118 sec, 5.097 sec = <strong>5.1075 sec</strong> on average</li>
</ul>
<p>The static and the virtual variant run at nearly the same speed (roughly 5.8185 sec on average), the inlined version runs in only roughly 87.78 % of the time.</p>
<h2>Upshot</h2>
<p>Certainly, inlining helps with a bunch of other optimizations, like <a href="http://en.wikipedia.org/wiki/Vectorization_%28computer_science%29">auto-vectorisation</a> or re-use of data, plus it increases <a href="http://en.wikipedia.org/wiki/Locality_of_reference">locality</a>, but has the disadvantage of potential code-bloat.</p>
<p>Also, at the time where the compiler decides to not inline a function, the performance difference between virtual and non-virtual decreases (w.r.t. several parameters and configurations), especially in tight loops. So if it would be a great benefit for your application to use virtual functions, then you might decide to use them.</p>
<h3>Example for a &#8220;great benefit&#8221; of virtual functions</h3>
<p>Just to give an example (blatant self promotion, sorry), my ray tracer <a href="http://picogen.org/">picogen</a> uses virtual functions for one of its shader systems (basically an executable <a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree">abstract syntax tree</a>; the performance drop is not too big as the shader is only called for definitive correct intersections, where in the meanwhile many other operations happened), plus it uses virtual functions for its intersectable objects (which include a <a href="http://en.wikipedia.org/wiki/Quadtree">quadtree</a>, a <a href="http://en.wikipedia.org/wiki/Bounding_interval_hierarchy">BIH</a>, <span style="text-decoration: line-through;">a <a href="http://en.wikipedia.org/wiki/Kd_tree">kd-tree</a></span> <small><small>oops that was the ray tracer I wrote before that, sorry</small></small>, spheres of course, a cube, a simple <a href="http://en.wikipedia.org/wiki/Digital_Differential_Analyzer_%28graphics_algorithm%29">DDA</a> based heightmap, and some hacks where I tried things out). The general BIH is an aggregate that can house any other type of Intersectable, including specific and general BIH. Also, I implemented a Whitted-style Ray Tracer and a Path Tracer (called &#8220;Surface Integrators&#8221;, like <a href="http://pbrt.org/">pbrt</a> calls it), which definitely are called for each pixel, even if there is no intersection at all.</p>
<p>Without virtual functions, this all would have been far clumsier, and not necessarily faster. Had I organized those objects in multiple lists, code could have even run slower than with virtual functions.</p>
]]></content:encoded>
			<wfw:commentRss>http://phresnel.org/blog/2009/02/virtual-functions-considered-not-harmful-part-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Virtual Functions Considered Not Harmful, Part I</title>
		<link>http://phresnel.org/blog/2009/02/virtual-functions-considered-not-harmful-part-i/</link>
		<comments>http://phresnel.org/blog/2009/02/virtual-functions-considered-not-harmful-part-i/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 12:52:15 +0000</pubDate>
		<dc:creator>phresnel</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[debunk]]></category>
		<category><![CDATA[gamedev.net]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[optimization]]></category>

		<guid isPermaLink="false">http://phresnel.org/blog/?p=51</guid>
		<description><![CDATA[Every now and then, the use of virtual functions gets questioned when it comes to runtime performance. I did a bit of work to find the (halfway) truth &#8230;
Recently on gamedev.net




Original post by NotAYakk
Note that implementing a faster/leaner virtual function object system in C++ is possible, but (A) it isn&#8217;t worth it in most every [...]]]></description>
			<content:encoded><![CDATA[<p>Every now and then, the use of virtual functions gets questioned when it comes to runtime performance. I did a bit of work to find the (halfway) truth &#8230;</p>
<address>Recently on <a title="gamedev.net" href="http://www.gamedev.net/community/forums/topic.asp?topic_id=524898" target="_self">gamedev.net</a></address>
<blockquote>
<table style="height: 48px;" border="0" cellspacing="0" cellpadding="4" width="508">
<tbody>
<tr>
<td class="quote"><!--/QUOTE--><!--STARTQUOTE--><em>Original post by NotAYakk</em><br />
Note that implementing a faster/leaner virtual function object system in C++ is possible, but (A) it isn&#8217;t worth it in most every case, and (B) it isn&#8217;t easy to get right.<br />
<!--QUOTE--></td>
</tr>
</tbody>
</table>
</blockquote>
<p><!--/QUOTE--><!--ENDQUOTE--><br />
Did he now mean a <a href="http://www.parashift.com/c++-faq-lite/virtual-functions.html">virtual-function</a> object system or a virtual <a href="http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.10">function-object system</a>? Anyways, I could guess what he means.</p>
<p>I don&#8217;t believe it is possible to code something that is <em>faster </em>and <em>leaner </em>and at the same time <em>as mighty as virtual functions</em>. At least not in valid C++, because there I already found something fast and lean, as follows in the next paragraphs. Anyways, feel free to slap the bitch with actual material, if you find some!<br />
<!--QUOTE--></p>
<blockquote>
<table border="0" cellspacing="0" cellpadding="4" width="95%">
<tbody>
<tr>
<td class="quote"><!--/QUOTE--><!--STARTQUOTE--><em>Original post by NotAYakk</em><br />
Virtual function overhead requires something done on a per-frame <strong>and</strong> per-pixel basis. Ie, if on every frame, you call the virtual function once per pixel, then you are starting to look at the the point where you should worry about virtual function overhead.</p>
<p>Before that (or other similar cases), it isn&#8217;t a concern.</p>
<p>&#8230;<!--QUOTE--></td>
</tr>
</tbody>
</table>
</blockquote>
<p><!--/QUOTE--><!--ENDQUOTE--></p>
<p>Calling virtual functions on per pixel per frame basis doesn&#8217;t mean anything. Actually, virtual functions are not <em>that</em> bad compared to ordinary, non-inlined calls, when they actually contain code. For example, if you do some dot-products, square roots, Reinhard operators, and the usual stuff one does at per-pixel level, then the cost gets negligible.</p>
<h2>Let&#8217;s ask Dr. GCC about the cost of virtual function calls</h2>
<p><strong><em>Preparation</em></strong></p>
<p><!--STARTSCRIPT--><!--source lang="cpp"--></p>
<div class="source">
<pre><div id="wpshdo_12" class="wp-synhighlighter-outer"><div id="wpshdt_12" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_12"></a><a id="wpshat_12" class="wp-synhighlighter-title" href="#codesyntax_12"  onClick="javascript:wpsh_toggleBlock(12)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_12" onClick="javascript:wpsh_code(12)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_12" onClick="javascript:wpsh_print(12)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_12" onClick="javascript:wpsh_about(12)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_12" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co2">#include &lt;cstdio&gt;</span>
&nbsp;
<span class="co2">#ifdef __GNUC__</span>
<span class="co2">#define MARK(x) do{asm volatile (&quot;# &quot;#x);}while(0)</span>
<span class="co2">#define NO_OPTIMIZE_AWAY() do{asm(&quot;&quot;);}while(0)</span>
<span class="co2">#else</span>
<span class="co2">#error &quot;dies&quot;</span>
<span class="co2">#endif</span>
&nbsp;
<span class="kw4">struct</span> Interface <span class="br0">&#123;</span>
    <span class="kw2">virtual</span> <span class="kw4">int</span> fun<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
    <span class="kw2">virtual</span> <span class="kw4">int</span> fun2 <span class="br0">&#40;</span><span class="kw4">int</span>, <span class="kw4">int</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
    <span class="kw2">virtual</span> <span class="kw4">float</span> dot3 <span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">float</span> <span class="sy2">*</span>, <span class="kw4">const</span> <span class="kw4">float</span> <span class="sy2">*</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw4">struct</span> Foo <span class="sy4">:</span> <span class="kw2">public</span> Interface <span class="br0">&#123;</span>
    <span class="kw4">int</span> <span class="kw4">const</span> ff<span class="sy4">;</span>
    Foo <span class="br0">&#40;</span><span class="kw4">int</span> ff<span class="br0">&#41;</span> <span class="sy4">:</span> ff <span class="br0">&#40;</span>ff<span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span>
&nbsp;
    <span class="kw4">int</span> fun<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> ff<span class="sy4">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw4">int</span> fun2 <span class="br0">&#40;</span><span class="kw4">int</span>, <span class="kw4">int</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> ff<span class="sy4">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw4">float</span> dot3 <span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">float</span> <span class="sy2">*</span>lhs, <span class="kw4">const</span> <span class="kw4">float</span> <span class="sy2">*</span>rhs<span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> lhs<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy2">*</span>rhs<span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy2">+</span> lhs<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="sy2">*</span>rhs<span class="br0">&#91;</span>1<span class="br0">&#93;</span> <span class="sy2">+</span> lhs<span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy2">*</span>rhs<span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy4">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw4">struct</span> Oof <span class="sy4">:</span> <span class="kw2">public</span> Foo <span class="br0">&#123;</span>
    <span class="kw4">int</span> <span class="kw4">const</span> ff<span class="sy4">;</span>
    Oof <span class="br0">&#40;</span><span class="kw4">int</span> ff<span class="br0">&#41;</span> <span class="sy4">:</span> Foo <span class="br0">&#40;</span>0<span class="br0">&#41;</span>, ff <span class="br0">&#40;</span>ff<span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span>
&nbsp;
    <span class="kw4">int</span> fun<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> ff<span class="sy4">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw4">struct</span> Bar <span class="br0">&#123;</span>
    <span class="kw4">int</span> <span class="kw4">const</span> ff<span class="sy4">;</span>
    Bar <span class="br0">&#40;</span><span class="kw4">int</span> ff<span class="br0">&#41;</span> <span class="sy4">:</span> ff <span class="br0">&#40;</span>ff<span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span>
    <span class="kw4">int</span> fun<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span> <span class="kw1">return</span> ff<span class="sy4">;</span> <span class="br0">&#125;</span>
    <span class="kw4">int</span> fun2 <span class="br0">&#40;</span><span class="kw4">int</span>, <span class="kw4">int</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> ff<span class="sy4">;</span>
    <span class="br0">&#125;</span>
    <span class="kw4">float</span> dot3 <span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">float</span> <span class="sy2">*</span>lhs, <span class="kw4">const</span> <span class="kw4">float</span> <span class="sy2">*</span>rhs<span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> lhs<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy2">*</span>rhs<span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy2">+</span> lhs<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="sy2">*</span>rhs<span class="br0">&#91;</span>1<span class="br0">&#93;</span> <span class="sy2">+</span> lhs<span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy2">*</span>rhs<span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy4">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span></pre></div></div></pre>
</div>
<p><!--ENDSCRIPT--><br />
<strong><em>Tests</em></strong></p>
<p><!--STARTSCRIPT--><!--source lang="cpp"--></p>
<div class="source">
<pre><div id="wpshdo_13" class="wp-synhighlighter-outer"><div id="wpshdt_13" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_13"></a><a id="wpshat_13" class="wp-synhighlighter-title" href="#codesyntax_13"  onClick="javascript:wpsh_toggleBlock(13)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_13" onClick="javascript:wpsh_code(13)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_13" onClick="javascript:wpsh_print(13)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_13" onClick="javascript:wpsh_about(13)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_13" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw4">int</span> main <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw4">int</span> entropy<span class="sy4">;</span>
    <span class="kw3">scanf</span> <span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>, <span class="sy3">&amp;</span>entropy<span class="br0">&#41;</span><span class="sy4">;</span>
    Interface <span class="sy3">&amp;</span>foo <span class="sy1">=</span> <span class="sy2">*</span><span class="kw3">new</span> Foo<span class="br0">&#40;</span>entropy<span class="br0">&#41;</span><span class="sy4">;</span>
    MARK<span class="br0">&#40;</span><span class="st0">&quot;Foo starts here ... &quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    entropy <span class="sy1">=</span> foo.<span class="me1">fun</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    MARK<span class="br0">&#40;</span><span class="st0">&quot;... and here it ends.&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw3">printf</span> <span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>, entropy<span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw3">delete</span> <span class="sy3">&amp;</span>foo<span class="sy4">;</span>
&nbsp;
    <span class="kw3">scanf</span> <span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>, <span class="sy3">&amp;</span>entropy<span class="br0">&#41;</span><span class="sy4">;</span>
    Interface <span class="sy3">&amp;</span>oof <span class="sy1">=</span> <span class="sy2">*</span><span class="kw3">new</span> Oof<span class="br0">&#40;</span>entropy<span class="br0">&#41;</span><span class="sy4">;</span>
    MARK<span class="br0">&#40;</span><span class="st0">&quot;Oof starts here ... &quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    entropy <span class="sy1">=</span> oof.<span class="me1">fun</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    MARK<span class="br0">&#40;</span><span class="st0">&quot;... and here it ends.&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw3">printf</span> <span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>, entropy<span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw3">delete</span> <span class="sy3">&amp;</span>oof<span class="sy4">;</span>
&nbsp;
    <span class="kw3">scanf</span> <span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>, <span class="sy3">&amp;</span>entropy<span class="br0">&#41;</span><span class="sy4">;</span>
    Bar <span class="sy3">&amp;</span>bar <span class="sy1">=</span> <span class="sy2">*</span><span class="kw3">new</span> Bar<span class="br0">&#40;</span>entropy<span class="br0">&#41;</span><span class="sy4">;</span>
    MARK<span class="br0">&#40;</span><span class="st0">&quot;Bar starts here ... &quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    entropy <span class="sy1">=</span> bar.<span class="me1">fun</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    MARK<span class="br0">&#40;</span><span class="st0">&quot;... and here it ends.&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw3">printf</span> <span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>, entropy<span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw3">delete</span> <span class="sy3">&amp;</span>bar<span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div></pre>
</div>
<p><!--ENDSCRIPT--></p>
<h2>Results</h2>
<div class="source">
<pre><div id="wpshdo_14" class="wp-synhighlighter-outer"><div id="wpshdt_14" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_14"></a><a id="wpshat_14" class="wp-synhighlighter-title" href="#codesyntax_14"  onClick="javascript:wpsh_toggleBlock(14)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_14" onClick="javascript:wpsh_code(14)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_14" onClick="javascript:wpsh_print(14)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_14" onClick="javascript:wpsh_about(14)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_14" class="wp-synhighlighter-inner" style="display: block;"><pre class="asm" style="font-family:monospace;"># <span class="kw1">call</span> to Foo<span class="sy0">::</span>fun<span class="br0">&#40;</span><span class="br0">&#41;</span>
	movl	<span class="sy0">-</span>12<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">eax</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">edx</span>
	movl	<span class="sy0">-</span>12<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> <span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">esp</span><span class="br0">&#41;</span>
	movl	<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">edx</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	<span class="kw1">call</span>	<span class="sy0">*%</span><span class="kw3">eax</span>
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> <span class="sy0">-</span>8<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span>
&nbsp;
# <span class="kw1">call</span> to Oof<span class="sy0">::</span>fun<span class="br0">&#40;</span><span class="br0">&#41;</span>
	movl	<span class="sy0">-</span>16<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">eax</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">edx</span>
	movl	<span class="sy0">-</span>16<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> <span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">esp</span><span class="br0">&#41;</span>
	movl	<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">edx</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	<span class="kw1">call</span>	<span class="sy0">*%</span><span class="kw3">eax</span>
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> <span class="sy0">-</span>8<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span>
&nbsp;
# <span class="kw1">call</span> to Bar<span class="sy0">::</span>fun<span class="br0">&#40;</span><span class="br0">&#41;</span>
	movl	<span class="sy0">-</span>20<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> <span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">esp</span><span class="br0">&#41;</span>
	<span class="kw1">call</span>	__ZNK3Bar3funEv
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> <span class="sy0">-</span>8<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span></pre></div></div></pre>
</div>
<p><!--ENDSCRIPT--><br />
We see that the op-count grew from 4 to 7 (increased by a factor of 1.75). The costs for the pure call will partially vanish with an increasing number of operands.</p>
<h2>Adding Parameters</h2>
<p>Let&#8217;s add another test-case (you can copy this into the function main() if you&#8217;re trying yourself):</p>
<p><!--STARTSCRIPT--><!--source lang="cpp"--></p>
<div class="source">
<pre><div id="wpshdo_15" class="wp-synhighlighter-outer"><div id="wpshdt_15" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_15"></a><a id="wpshat_15" class="wp-synhighlighter-title" href="#codesyntax_15"  onClick="javascript:wpsh_toggleBlock(15)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_15" onClick="javascript:wpsh_code(15)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_15" onClick="javascript:wpsh_print(15)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_15" onClick="javascript:wpsh_about(15)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_15" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="sy2">*</span>snip<span class="sy2">*</span>
<span class="kw4">int</span> main <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="sy2">*</span>snip<span class="sy2">*</span>
    <span class="kw4">int</span> entropy2, entropy3<span class="sy4">;</span>
    <span class="kw3">scanf</span> <span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>, <span class="sy3">&amp;</span>entropy, <span class="sy3">&amp;</span>entropy2, <span class="sy3">&amp;</span>entropy3<span class="br0">&#41;</span><span class="sy4">;</span>
    Interface <span class="sy3">&amp;</span>foo2 <span class="sy1">=</span> <span class="sy2">*</span><span class="kw3">new</span> Foo<span class="br0">&#40;</span>entropy<span class="br0">&#41;</span><span class="sy4">;</span>
    MARK<span class="br0">&#40;</span><span class="st0">&quot;Foo2 starts here ... &quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    entropy <span class="sy1">=</span> foo2.<span class="me1">fun2</span> <span class="br0">&#40;</span>entropy2,entropy3<span class="br0">&#41;</span><span class="sy4">;</span>
    MARK<span class="br0">&#40;</span><span class="st0">&quot;... and here it ends.&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw3">printf</span> <span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>, entropy, entropy2, entropy3<span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw3">delete</span> <span class="sy3">&amp;</span>foo2<span class="sy4">;</span>
&nbsp;
    <span class="kw3">scanf</span> <span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>, <span class="sy3">&amp;</span>entropy, <span class="sy3">&amp;</span>entropy2, <span class="sy3">&amp;</span>entropy3<span class="br0">&#41;</span><span class="sy4">;</span>
    Bar <span class="sy3">&amp;</span>bar2 <span class="sy1">=</span> <span class="sy2">*</span><span class="kw3">new</span> Bar<span class="br0">&#40;</span>entropy<span class="br0">&#41;</span><span class="sy4">;</span>
    MARK<span class="br0">&#40;</span><span class="st0">&quot;Bar2 starts here ... &quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    entropy <span class="sy1">=</span> bar2.<span class="me1">fun2</span> <span class="br0">&#40;</span>entropy2,entropy3<span class="br0">&#41;</span><span class="sy4">;</span>
    MARK<span class="br0">&#40;</span><span class="st0">&quot;... and here it ends.&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw3">printf</span> <span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>, entropy, entropy2, entropy3<span class="br0">&#41;</span><span class="sy4">;</span>
    <span class="kw3">delete</span> <span class="sy3">&amp;</span>bar2<span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div></pre>
</div>
<p><!--ENDSCRIPT--><br />
The results for this:</p>
<p><!--STARTSCRIPT--><!--source lang="asm"--></p>
<div class="source">
<pre><div id="wpshdo_16" class="wp-synhighlighter-outer"><div id="wpshdt_16" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_16"></a><a id="wpshat_16" class="wp-synhighlighter-title" href="#codesyntax_16"  onClick="javascript:wpsh_toggleBlock(16)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_16" onClick="javascript:wpsh_code(16)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_16" onClick="javascript:wpsh_print(16)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_16" onClick="javascript:wpsh_about(16)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_16" class="wp-synhighlighter-inner" style="display: block;"><pre class="asm" style="font-family:monospace;"># Foo<span class="sy0">::</span>fun2<span class="br0">&#40;</span><span class="kw1">int</span><span class="sy0">,</span><span class="kw1">int</span><span class="br0">&#41;</span>
	movl	<span class="sy0">-</span>32<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">eax</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">edx</span>
	addl	$4<span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">edx</span>
	movl	<span class="sy0">-</span>28<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> 8<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">esp</span><span class="br0">&#41;</span>
	movl	<span class="sy0">-</span>24<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> 4<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">esp</span><span class="br0">&#41;</span>
	movl	<span class="sy0">-</span>32<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> <span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">esp</span><span class="br0">&#41;</span>
	movl	<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">edx</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	<span class="kw1">call</span>	<span class="sy0">*%</span><span class="kw3">eax</span>
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> <span class="sy0">-</span>8<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span>
# Bar<span class="sy0">::</span>fun2<span class="br0">&#40;</span><span class="kw1">int</span><span class="sy0">,</span><span class="kw1">int</span><span class="br0">&#41;</span>
	movl	<span class="sy0">-</span>28<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> 8<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">esp</span><span class="br0">&#41;</span>
	movl	<span class="sy0">-</span>24<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> 4<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">esp</span><span class="br0">&#41;</span>
	movl	<span class="sy0">-</span>36<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> <span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">esp</span><span class="br0">&#41;</span>
	<span class="kw1">call</span>	__ZNK3Bar4fun2Eii
	movl	<span class="sy0">%</span><span class="kw3">eax</span><span class="sy0">,</span> <span class="sy0">-</span>8<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span></pre></div></div></pre>
</div>
<p><!--ENDSCRIPT--><br />
This time, it increased by 1.5 (12 ops virtual, 8 ops non-virtual).</p>
<h2>Adding code at the target site</h2>
<p><em>This was just the call!</em> Now we&#8217;ll add upp the code of the functions themselves. The function definitions look all the same, so I just show one of them:</p>
<p><!--STARTSCRIPT--><!--source lang="asm"--></p>
<div class="source">
<pre><div id="wpshdo_17" class="wp-synhighlighter-outer"><div id="wpshdt_17" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_17"></a><a id="wpshat_17" class="wp-synhighlighter-title" href="#codesyntax_17"  onClick="javascript:wpsh_toggleBlock(17)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_17" onClick="javascript:wpsh_code(17)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_17" onClick="javascript:wpsh_print(17)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_17" onClick="javascript:wpsh_about(17)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_17" class="wp-synhighlighter-inner" style="display: block;"><pre class="asm" style="font-family:monospace;">__ZNK3Bar4fun2Eii<span class="sy0">:</span>
	pushl	<span class="sy0">%</span><span class="kw3">ebp</span>
	movl	<span class="sy0">%</span><span class="kw3">esp</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">ebp</span>
	movl	8<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">eax</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	popl	<span class="sy0">%</span><span class="kw3">ebp</span>
	<span class="kw1">ret</span></pre></div></div></span></pre>
</div>
<p><!--ENDSCRIPT--><br />
We see that to the call-ops, we have to add 6 more ops, so our previous growage of 1.75 decreases to (7+6) / (4+6) = 1.3, and 1.5 decreaes to (12+6) / (8+6) = approx. 1.29.</p>
<h2>Adding <em>actual </em>code to the target site</h2>
<p>Now let&#8217;s have a look at the assembly produced for our dot-product-functions. Remember, they looked as simple as:</p>
<pre><div id="wpshdo_18" class="wp-synhighlighter-outer"><div id="wpshdt_18" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_18"></a><a id="wpshat_18" class="wp-synhighlighter-title" href="#codesyntax_18"  onClick="javascript:wpsh_toggleBlock(18)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_18" onClick="javascript:wpsh_code(18)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_18" onClick="javascript:wpsh_print(18)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_18" onClick="javascript:wpsh_about(18)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_18" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw4">float</span> dot3 <span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">float</span> <span class="sy2">*</span>lhs, <span class="kw4">const</span> <span class="kw4">float</span> <span class="sy2">*</span>rhs<span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> lhs<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy2">*</span>rhs<span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy2">+</span> lhs<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="sy2">*</span>rhs<span class="br0">&#91;</span>1<span class="br0">&#93;</span> <span class="sy2">+</span> lhs<span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy2">*</span>rhs<span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div></pre>
<p>The assembly for all versions again look the same, so here is just one of them:</p>
<p><!--STARTSCRIPT--><!--source lang="asm"--></p>
<div class="source">
<pre><div id="wpshdo_19" class="wp-synhighlighter-outer"><div id="wpshdt_19" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_19"></a><a id="wpshat_19" class="wp-synhighlighter-title" href="#codesyntax_19"  onClick="javascript:wpsh_toggleBlock(19)" title="Click to show/hide code block">Code block</a></td><td align="right"><a href="#codesyntax_19" onClick="javascript:wpsh_code(19)" title="Show code only"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_19" onClick="javascript:wpsh_print(19)" title="Print code"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="#codesyntax_19" onClick="javascript:wpsh_about(19)" title="Show plugin information"><img border="0" style="border: 0 none" src="http://phresnel.org/blog/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_19" class="wp-synhighlighter-inner" style="display: block;"><pre class="asm" style="font-family:monospace;">pushl	<span class="sy0">%</span><span class="kw3">ebp</span>
	movl	<span class="sy0">%</span><span class="kw3">esp</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">ebp</span>
	movl	12<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	16<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">edx</span>
	flds	<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">eax</span><span class="br0">&#41;</span>
	fmuls	<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">edx</span><span class="br0">&#41;</span>
	movl	12<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	addl	$4<span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	16<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">edx</span>
	addl	$4<span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">edx</span>
	flds	<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">eax</span><span class="br0">&#41;</span>
	fmuls	<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">edx</span><span class="br0">&#41;</span>
	<span class="kw2">faddp</span>	<span class="sy0">%</span><span class="kw3">st</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">st</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span>
	movl	12<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	addl	$8<span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">eax</span>
	movl	16<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">ebp</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">edx</span>
	addl	$8<span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">edx</span>
	flds	<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">eax</span><span class="br0">&#41;</span>
	fmuls	<span class="br0">&#40;</span><span class="sy0">%</span><span class="kw3">edx</span><span class="br0">&#41;</span>
	<span class="kw2">faddp</span>	<span class="sy0">%</span><span class="kw3">st</span><span class="sy0">,</span> <span class="sy0">%</span><span class="kw3">st</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span>
	popl	<span class="sy0">%</span><span class="kw3">ebp</span>
	<span class="kw1">ret</span></pre></div></div></pre>
</div>
<p><!--ENDSCRIPT--></p>
<p>And we find 22 instructions, for a simple dot-product. Our additional cost is now:</p>
<ul>
<li>(12+22) / (8+22) = approx. 1.1333</li>
</ul>
<p>So instead of 40 frames per second, you get &#8220;only&#8221; 36, but you get many benefits. Also, just add some more operations, and the relative overhead further decreases. And the blanket statement &#8220;virtual functions at per pixel per frame level considered harmful&#8221; (not sic!) vanishes.</p>
<h2>We learn today (how pathetic :D)&#8230;</h2>
<p><strong><em>&#8230;</em></strong> that the cost (*) of calling a virtual function compared to a non-inlined non-virtual function vanishes with the number of arguments you pass to the function, the complexity of what is <em>inside</em> the function and with the number of return values (in C/C++ either 0 or 1)</p>
<p>(*): Actually with respect to size/op-count, as we haven&#8217;t done any benchmark yet, but see part 2.</p>
<h4>sidenote:</h4>
<p><!--QUOTE--></p>
<blockquote><p><span class="smallfont">Quote:</span></p>
<table border="0" cellspacing="0" cellpadding="4" width="95%">
<tbody>
<tr>
<td class="quote"><!--/QUOTE--><!--STARTQUOTE-->No, don&#8217;t do epic switch statements.<!--QUOTE--></td>
</tr>
</tbody>
</table>
</blockquote>
<p><!--/QUOTE--><!--ENDQUOTE--><br />
But sometimes, only sometimes, epic switch statements <strong>are</strong> the right thing. For example if you write a performant software based virtual machine, with many trivial micro operations (e.g. add or mul), then you want jump tables. And jump tables you generally only get with epic switch statements, or by relying on pointers-to-labels (GCC has support for them, but they are not standard).</p>
]]></content:encoded>
			<wfw:commentRss>http://phresnel.org/blog/2009/02/virtual-functions-considered-not-harmful-part-i/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
