Files
2016-11-12 23:15:08 -05:00

11 lines
11 KiB
HTML

<html><head><link rel="stylesheet" href="style.css"></head><body><div class="page">
<h1>20101004 - MSVC Optimizing Static Constant Function Tables?</h1>
<br>
Nope. Would be nice if the MSVC compiler could optimize FunctionJump() like FunctionIf() below,<br /><br /><!-- HTML generated using hilite.me --><div style="background: #f8f8f8; overflow:auto;width:auto;color:black;background:white;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #8f5902; font-style: italic">#include &lt;stdio.h&gt;</span><br /><br /><span style="color: #204a87; font-weight: bold">typedef</span> <span style="color: #204a87; font-weight: bold">void</span> <span style="color: #000000; font-weight: bold">(</span><span style="color: #ce5c00; font-weight: bold">*</span><span style="color: #000000">Function</span><span style="color: #000000; font-weight: bold">)(</span><span style="color: #204a87; font-weight: bold">const</span> <span style="color: #204a87; font-weight: bold">int</span><span style="color: #000000; font-weight: bold">);</span><br /><br /><span style="color: #204a87; font-weight: bold">static</span> <span style="color: #204a87; font-weight: bold">__forceinline</span> <span style="color: #204a87; font-weight: bold">void</span> <span style="color: #000000">FunctionA</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #204a87; font-weight: bold">const</span> <span style="color: #204a87; font-weight: bold">int</span> <span style="color: #000000">input</span><span style="color: #000000; font-weight: bold">)</span> <span style="color: #000000; font-weight: bold">{</span> <span style="color: #000000">printf</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #4e9a06">&quot;a=%d\n&quot;</span><span style="color: #000000; font-weight: bold">,</span> <span style="color: #000000">input</span><span style="color: #000000; font-weight: bold">);</span> <span style="color: #000000; font-weight: bold">}</span><br /><span style="color: #204a87; font-weight: bold">static</span> <span style="color: #204a87; font-weight: bold">__forceinline</span> <span style="color: #204a87; font-weight: bold">void</span> <span style="color: #000000">FunctionB</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #204a87; font-weight: bold">const</span> <span style="color: #204a87; font-weight: bold">int</span> <span style="color: #000000">input</span><span style="color: #000000; font-weight: bold">)</span> <span style="color: #000000; font-weight: bold">{</span> <span style="color: #000000">printf</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #4e9a06">&quot;b=%d\n&quot;</span><span style="color: #000000; font-weight: bold">,</span> <span style="color: #000000">input</span><span style="color: #000000; font-weight: bold">);</span> <span style="color: #000000; font-weight: bold">}</span><br /><br /><span style="color: #204a87; font-weight: bold">static</span> <span style="color: #204a87; font-weight: bold">const</span> <span style="color: #000000">Function</span> <span style="color: #000000">function</span><span style="color: #000000; font-weight: bold">[</span><span style="color: #0000cf; font-weight: bold">2</span><span style="color: #000000; font-weight: bold">]</span> <span style="color: #ce5c00; font-weight: bold">=</span> <span style="color: #000000; font-weight: bold">{</span> <span style="color: #000000">FunctionA</span><span style="color: #000000; font-weight: bold">,</span> <span style="color: #000000">FunctionB</span> <span style="color: #000000; font-weight: bold">};</span><br /> <br /><span style="color: #204a87; font-weight: bold">static</span> <span style="color: #204a87; font-weight: bold">__forceinline</span> <span style="color: #204a87; font-weight: bold">void</span> <span style="color: #000000">FunctionJump</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #204a87; font-weight: bold">const</span> <span style="color: #204a87; font-weight: bold">int</span> <span style="color: #000000">input</span><span style="color: #000000; font-weight: bold">)</span> <span style="color: #000000; font-weight: bold">{</span> <span style="color: #000000">function</span><span style="color: #000000; font-weight: bold">[</span><span style="color: #000000">input</span><span style="color: #000000; font-weight: bold">](</span><span style="color: #000000">input</span><span style="color: #000000; font-weight: bold">);</span> <span style="color: #000000; font-weight: bold">}</span><br /><br /><span style="color: #204a87; font-weight: bold">static</span> <span style="color: #204a87; font-weight: bold">__forceinline</span> <span style="color: #204a87; font-weight: bold">void</span> <span style="color: #000000">FunctionIf</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #204a87; font-weight: bold">const</span> <span style="color: #204a87; font-weight: bold">int</span> <span style="color: #000000">input</span><span style="color: #000000; font-weight: bold">)</span> <span style="color: #000000; font-weight: bold">{</span><br /> <span style="color: #204a87; font-weight: bold">if</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #000000">input</span> <span style="color: #ce5c00; font-weight: bold">==</span> <span style="color: #0000cf; font-weight: bold">0</span><span style="color: #000000; font-weight: bold">)</span> <span style="color: #000000">FunctionA</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #000000">input</span><span style="color: #000000; font-weight: bold">);</span><br /> <span style="color: #204a87; font-weight: bold">if</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #000000">input</span> <span style="color: #ce5c00; font-weight: bold">==</span> <span style="color: #0000cf; font-weight: bold">1</span><span style="color: #000000; font-weight: bold">)</span> <span style="color: #000000">FunctionB</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #000000">input</span><span style="color: #000000; font-weight: bold">);</span> <span style="color: #000000; font-weight: bold">}</span><br /><br /><span style="color: #204a87; font-weight: bold">void</span> <span style="color: #000000">main</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #204a87; font-weight: bold">void</span><span style="color: #000000; font-weight: bold">)</span> <span style="color: #000000; font-weight: bold">{</span><br /> <span style="color: #000000">FunctionJump</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #0000cf; font-weight: bold">0</span><span style="color: #000000; font-weight: bold">);</span><br /> <span style="color: #000000">FunctionJump</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #0000cf; font-weight: bold">1</span><span style="color: #000000; font-weight: bold">);</span><br /> <span style="color: #000000">FunctionIf</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #0000cf; font-weight: bold">0</span><span style="color: #000000; font-weight: bold">);</span><br /> <span style="color: #000000">FunctionIf</span><span style="color: #000000; font-weight: bold">(</span><span style="color: #0000cf; font-weight: bold">1</span><span style="color: #000000; font-weight: bold">);</span> <span style="color: #000000; font-weight: bold">}</span><br /></pre></div><br /><br />Trimmed section from assembly output /FAs,<br /><br /><!-- HTML generated using hilite.me --><div style="background: #f8f8f8; overflow:auto;width:auto;color:black;background:white;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #000000">PUBLIC</span> <span style="color: #000000">_main</span><br /><span style="color: #8f5902; font-style: italic">; Function compile flags: /Ogtpy</span><br /><span style="color: #000000">_TEXT</span> <span style="color: #204a87; font-weight: bold">SEG</span><span style="color: #000000">MENT</span><br /><span style="color: #000000">_main</span> <span style="color: #000000">PROC</span><br /><br /><span style="color: #8f5902; font-style: italic">; 17 : FunctionJump(0);</span><br /><br /> <span style="color: #000000">push</span> <span style="color: #0000cf; font-weight: bold">0</span><br /> <span style="color: #000000">call</span> <span style="color: #204a87; font-weight: bold">DWORD</span> <span style="color: #000000">PTR</span> <span style="color: #000000">_function</span><br /><br /><span style="color: #8f5902; font-style: italic">; 18 : FunctionJump(1);</span><br /><br /> <span style="color: #000000">push</span> <span style="color: #0000cf; font-weight: bold">1</span><br /> <span style="color: #000000">call</span> <span style="color: #204a87; font-weight: bold">DWORD</span> <span style="color: #000000">PTR</span> <span style="color: #000000">_function</span><span style="color: #ce5c00; font-weight: bold">+</span><span style="color: #0000cf; font-weight: bold">4</span><br /><br /><span style="color: #8f5902; font-style: italic">; 19 : FunctionIf(0);</span><br /><br /> <span style="color: #000000">push</span> <span style="color: #0000cf; font-weight: bold">0</span><br /> <span style="color: #000000">push</span> <span style="color: #000000">OFFSET</span> <span style="color: #204a87; font-weight: bold">$</span><span style="color: #000000">SG3833</span><br /> <span style="color: #000000">call</span> <span style="color: #000000">_printf</span><br /><br /><span style="color: #8f5902; font-style: italic">; 20 : FunctionIf(1); }</span><br /><br /> <span style="color: #000000">push</span> <span style="color: #0000cf; font-weight: bold">1</span><br /> <span style="color: #000000">push</span> <span style="color: #000000">OFFSET</span> <span style="color: #204a87; font-weight: bold">$</span><span style="color: #000000">SG3837</span><br /> <span style="color: #000000">call</span> <span style="color: #000000">_printf</span><br /> <span style="color: #000000">add</span> <span style="color: #204a87">esp</span><span style="color: #000000; font-weight: bold">,</span> <span style="color: #0000cf; font-weight: bold">24</span> <span style="color: #8f5902; font-style: italic">; 00000018H</span><br /> <span style="color: #000000">xor</span> <span style="color: #204a87">eax</span><span style="color: #000000; font-weight: bold">,</span> <span style="color: #204a87">eax</span><br /> <span style="color: #000000">ret</span> <span style="color: #0000cf; font-weight: bold">0</span><br /><span style="color: #000000">_main</span> <span style="color: #000000">ENDP</span><br /></pre></div>
</div></body></html>