<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[short als Übergabeparamter gleich schnell wie int?]]></title><description><![CDATA[<p>Hallo,<br />
man liest da des öfteren, dass Typen, die die Registerbreite exakt ausnutzen schneller sind als andere.<br />
Wenn ich jetzt aber z.B. eine Funktion</p>
<pre><code class="language-cpp">void foo(short x, short y)
</code></pre>
<p>habe, wird dann von modernen Compilern (MSVC, GCC) das ganze zu einem 32-Bit Typ optimiert, oder werden dann zwei mal 16-Bit durch die Register gejagt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284602/short-als-übergabeparamter-gleich-schnell-wie-int</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 22:17:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284602.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 04 Apr 2011 16:01:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to short als Übergabeparamter gleich schnell wie int? on Mon, 04 Apr 2011 16:01:06 GMT]]></title><description><![CDATA[<p>Hallo,<br />
man liest da des öfteren, dass Typen, die die Registerbreite exakt ausnutzen schneller sind als andere.<br />
Wenn ich jetzt aber z.B. eine Funktion</p>
<pre><code class="language-cpp">void foo(short x, short y)
</code></pre>
<p>habe, wird dann von modernen Compilern (MSVC, GCC) das ganze zu einem 32-Bit Typ optimiert, oder werden dann zwei mal 16-Bit durch die Register gejagt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044604</guid><dc:creator><![CDATA[Pikkolini]]></dc:creator><pubDate>Mon, 04 Apr 2011 16:01:06 GMT</pubDate></item><item><title><![CDATA[Reply to short als Übergabeparamter gleich schnell wie int? on Mon, 04 Apr 2011 16:16:19 GMT]]></title><description><![CDATA[<p>Wir haben <a href="http://www.c-plusplus.net/forum/284550" rel="nofollow">hier</a> gerade einen sehr ähnlichen Thread.</p>
<p>Ich denke, deine Frage ist schwierig allgemein zu beantworten, zumal solche Dinge auch von Compilereinstellungen und Optimierungen (und erst recht vom Compiler selbst) abhängen. Aber der erzeugte Assemblercode könnte Licht ins Dunkel bringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044614</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 04 Apr 2011 16:16:19 GMT</pubDate></item><item><title><![CDATA[Reply to short als Übergabeparamter gleich schnell wie int? on Mon, 04 Apr 2011 16:14:19 GMT]]></title><description><![CDATA[<p>Pikkolini schrieb:</p>
<blockquote>
<p>habe, wird dann von modernen Compilern (MSVC, GCC) das ganze zu einem 32-Bit Typ optimiert, oder werden dann zwei mal 16-Bit durch die Register gejagt?</p>
</blockquote>
<p>Da hilft wohl nur ausprobieren und im Maschinencode gucken. Sofern du aber auf Geschwindigkeit optimierst, würde ich jedoch auf zwei Maschinenworte tippen. Schließlich würde das Verpacken von zwei Shorts in einen einzelnen, größeren Typ eine nicht trivial Rechenoperation sein für die die Werte ohnehin in den Prozessor geladen werden müssten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044615</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 04 Apr 2011 16:14:19 GMT</pubDate></item><item><title><![CDATA[Reply to short als Übergabeparamter gleich schnell wie int? on Mon, 04 Apr 2011 16:48:57 GMT]]></title><description><![CDATA[<p>Das sagt die Disassembly bei vollständiger Optimierung:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void foo(int x, int y) {
	std::cout &lt;&lt; x &lt;&lt; y &lt;&lt; std::endl;
}

void foo(short x, short y) {
	std::cout &lt;&lt; x &lt;&lt; y &lt;&lt; std::endl;
}

int main()
{
	foo(10,10);
013E1000  mov         eax,dword ptr [__imp_std::endl (13E2050h)]  
013E1005  mov         ecx,dword ptr [__imp_std::cout (13E204Ch)]  
013E100B  push        eax  
013E100C  push        0Ah  
013E100E  push        0Ah  
013E1010  call        dword ptr [__imp_std::basic_ostream&lt;char,std::char_traits&lt;char&gt; &gt;::operator&lt;&lt; (13E2048h)]  
013E1016  mov         ecx,eax  
013E1018  call        dword ptr [__imp_std::basic_ostream&lt;char,std::char_traits&lt;char&gt; &gt;::operator&lt;&lt; (13E2048h)]  
013E101E  mov         ecx,eax  
013E1020  call        dword ptr [__imp_std::basic_ostream&lt;char,std::char_traits&lt;char&gt; &gt;::operator&lt;&lt; (13E2044h)]  
	foo(10,10);
013E1026  mov         ecx,dword ptr [__imp_std::endl (13E2050h)]  
013E102C  push        ecx  
013E102D  mov         ecx,dword ptr [__imp_std::cout (13E204Ch)]  
013E1033  push        0Ah  
013E1035  push        0Ah  
013E1037  call        dword ptr [__imp_std::basic_ostream&lt;char,std::char_traits&lt;char&gt; &gt;::operator&lt;&lt; (13E2048h)]  
013E103D  mov         ecx,eax  
013E103F  call        dword ptr [__imp_std::basic_ostream&lt;char,std::char_traits&lt;char&gt; &gt;::operator&lt;&lt; (13E2048h)]  
013E1045  mov         ecx,eax  
013E1047  call        dword ptr [__imp_std::basic_ostream&lt;char,std::char_traits&lt;char&gt; &gt;::operator&lt;&lt; (13E2044h)]  
	return 0;
013E104D  xor         eax,eax  
}
013E104F  ret
</code></pre>
<p>Ich bin jetzt nicht sonderlich Assemblerversiert, aber es sieht so aus, als wäre die Version mit int schneller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044637</guid><dc:creator><![CDATA[Pikkolini]]></dc:creator><pubDate>Mon, 04 Apr 2011 16:48:57 GMT</pubDate></item><item><title><![CDATA[Reply to short als Übergabeparamter gleich schnell wie int? on Mon, 04 Apr 2011 17:07:19 GMT]]></title><description><![CDATA[<p>mit welchem Program schaut man sich sowas (unter linux) an?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044650</guid><dc:creator><![CDATA[padreigh]]></dc:creator><pubDate>Mon, 04 Apr 2011 17:07:19 GMT</pubDate></item><item><title><![CDATA[Reply to short als Übergabeparamter gleich schnell wie int? on Mon, 04 Apr 2011 17:13:25 GMT]]></title><description><![CDATA[<p>padreigh schrieb:</p>
<blockquote>
<p>mit welchem Program schaut man sich sowas (unter linux) an?</p>
</blockquote>
<p>less <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Das ist einfach die Ausgabe wenn du den Compiler mit der -S Option aufrufst.</p>
<p>Mach dich auch mit den anderen Zwischenschritten vertraut:<br />
-E: Nur Präprozessor aufrufen, nicht compilieren<br />
-S: Nur Präprozessor und Compiler aufrufen, nicht Assemblieren<br />
-c: Nur Präprozessor, Compiler und Assembler aufrufen, nicht linken</p>
<p>Das alles natürlich nur für GNU Compiler, aber bei anderen Compilern heißen die Optionen meistens genauso. Will ich aber nicht für alle Compiler beschwören.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044653</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 04 Apr 2011 17:13:25 GMT</pubDate></item><item><title><![CDATA[Reply to short als Übergabeparamter gleich schnell wie int? on Mon, 04 Apr 2011 17:45:32 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24051">@Pikkolini</a>: Du erstellt zwei gleichnamige Funktionen um einen Unterschied zwischen beiden zu erkennen? Wie wäre es mit foo1 und foo2?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044671</guid><dc:creator><![CDATA[EinGast]]></dc:creator><pubDate>Mon, 04 Apr 2011 17:45:32 GMT</pubDate></item><item><title><![CDATA[Reply to short als Übergabeparamter gleich schnell wie int? on Mon, 04 Apr 2011 23:23:12 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24051">@Pikkolini</a>:<br />
Genau Registerbreite oder kleiner als Registerbreite spielt in den meisten Fällen keinen Walzer. Unterschiede können bestehen, sind aber eher zu vernachlässigen.<br />
Wichtig ist halt: nicht GRÖSSER als die Registerbreite. Also 64 bittiges Gedöns mit 32 bittigem Instruction-Set, das tut weh. Merkbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044775</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 04 Apr 2011 23:23:12 GMT</pubDate></item><item><title><![CDATA[Reply to short als Übergabeparamter gleich schnell wie int? on Tue, 05 Apr 2011 01:14:26 GMT]]></title><description><![CDATA[<p>short sollte 8 Bit sein, also wäre</p>
<pre><code class="language-cpp">push 0Ah
pop al
</code></pre>
<p>eigentlich angebracht, aber das wird wohl gar nicht mehr von irgendwelchen compilern unterstützt/umgesetzt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044778</guid><dc:creator><![CDATA[EOP]]></dc:creator><pubDate>Tue, 05 Apr 2011 01:14:26 GMT</pubDate></item><item><title><![CDATA[Reply to short als Übergabeparamter gleich schnell wie int? on Tue, 05 Apr 2011 02:32:22 GMT]]></title><description><![CDATA[<p>GCC unter x86-64 behandelt short-Werte bei der Übergabe als 32-Bit-Parameter, sprich die höheren 16 Bits werden bei Bedarf durch sign extend ausgelöscht.<br />
Trotzdem werden keine zwei shorts in das gleiche 64-Bit-Register gepackt. Das wäre kontraproduktiv und verbietet sich schon wegen der calling convention.<br />
short-Arithmetik findet dementsprechend hauptsächlich auch auf 32-Bit-Ebene statt, es sei denn, es müssen Werte aus dem RAM gelesen werden.<br />
Ob man short oder int verwendet, ist im Hinblick auf Performanz daher i.d.R. egal, der Compiler macht zum Glück sowieso, was er will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044779</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Tue, 05 Apr 2011 02:32:22 GMT</pubDate></item><item><title><![CDATA[Reply to short als Übergabeparamter gleich schnell wie int? on Tue, 05 Apr 2011 06:34:49 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24051">@Pikkolini</a></p>
<p>Übersehe ich gerade etwas, oder rufst du einfach zweimal die gleiche Funktion auf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044785</guid><dc:creator><![CDATA[EinEtwasAndererGast]]></dc:creator><pubDate>Tue, 05 Apr 2011 06:34:49 GMT</pubDate></item><item><title><![CDATA[Reply to short als Übergabeparamter gleich schnell wie int? on Tue, 05 Apr 2011 08:21:58 GMT]]></title><description><![CDATA[<p>@EinEtwasAndererGast:</p>
<p>Sehe ich auch so.<br />
Ich hab's mal explizit gemacht. Bei mir (VS2005) ist auch keinerlei Unterschied:</p>
<pre><code class="language-cpp">void fooint(int x, int y) {
    std::cout &lt;&lt; x &lt;&lt; y /*&lt;&lt; std::endl*/;
}

void fooshort(short x, short y) {
    std::cout &lt;&lt; x &lt;&lt; y /*&lt;&lt; std::endl*/;
}

int main()
{
    fooint(10,10); 
00401000  mov         ecx,dword ptr [__imp_std::cout (402040h)] 
00401006  push        0Ah  
00401008  push        0Ah  
0040100A  call        dword ptr [__imp_std::basic_ostream&lt;char,std::char_traits&lt;char&gt; &gt;::operator&lt;&lt; (402038h)] 
00401010  mov         ecx,eax 
00401012  call        dword ptr [__imp_std::basic_ostream&lt;char,std::char_traits&lt;char&gt; &gt;::operator&lt;&lt; (402038h)] 
	fooshort(10,10);
00401018  mov         ecx,dword ptr [__imp_std::cout (402040h)] 
0040101E  push        0Ah  
00401020  push        0Ah  
00401022  call        dword ptr [__imp_std::basic_ostream&lt;char,std::char_traits&lt;char&gt; &gt;::operator&lt;&lt; (40203Ch)] 
00401028  mov         ecx,eax 
0040102A  call        dword ptr [__imp_std::basic_ostream&lt;char,std::char_traits&lt;char&gt; &gt;::operator&lt;&lt; (40203Ch)] 

	return 0;
00401030  xor         eax,eax 
}
00401032  ret
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2044808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044808</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Tue, 05 Apr 2011 08:21:58 GMT</pubDate></item></channel></rss>