<?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[struct align auf nächste 2er Potenz in array]]></title><description><![CDATA[<p>Hi,</p>
<p>habe folgendes Problem:</p>
<p>Ich habe eine typedef struct xstruct mit einer Größe in Bytes die je nach<br />
gesetzten #define unterschiedliche Größen annehmen kann.</p>
<p>Aus dieser Struktur baue ich ein Array:</p>
<p>xstruct xs_array[100];</p>
<p>Da ich sehr oft auf dieses Array zugreifen muss, spielt Performance<br />
eine grosse Rolle. Aus diesem Grund möcht ich die Grösse von xstruct<br />
auf die nächste 2er Potenz auffüllen wie z.B.:</p>
<p>echte Grösse aufgefüllte Grösse<br />
55 -&gt; 64<br />
59 -&gt; 64<br />
88 -&gt; 128<br />
120 -&gt; 128<br />
176 -&gt; 256<br />
etc.</p>
<p>damit bei der Array-Addressierung/Indexierung nur ein shift und kein mul<br />
gemacht werden muss. Dies soll automatisch zur Compile-Zeit (GNU C++)<br />
passieren und nicht zur Runtime.</p>
<p>Gibt es da einen eleganten Trick <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> ?</p>
<p>Ich könnte die siezeof(xstruct) 32 x nach rechts shiften und jedesmal<br />
mit sich selbst ORen und dann eins dazuzählen ... aber das ist hässlich!</p>
<p>Danke<br />
Markus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/181607/struct-align-auf-nächste-2er-potenz-in-array</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 11:05:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/181607.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 May 2007 14:27:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to struct align auf nächste 2er Potenz in array on Tue, 15 May 2007 14:27:47 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>habe folgendes Problem:</p>
<p>Ich habe eine typedef struct xstruct mit einer Größe in Bytes die je nach<br />
gesetzten #define unterschiedliche Größen annehmen kann.</p>
<p>Aus dieser Struktur baue ich ein Array:</p>
<p>xstruct xs_array[100];</p>
<p>Da ich sehr oft auf dieses Array zugreifen muss, spielt Performance<br />
eine grosse Rolle. Aus diesem Grund möcht ich die Grösse von xstruct<br />
auf die nächste 2er Potenz auffüllen wie z.B.:</p>
<p>echte Grösse aufgefüllte Grösse<br />
55 -&gt; 64<br />
59 -&gt; 64<br />
88 -&gt; 128<br />
120 -&gt; 128<br />
176 -&gt; 256<br />
etc.</p>
<p>damit bei der Array-Addressierung/Indexierung nur ein shift und kein mul<br />
gemacht werden muss. Dies soll automatisch zur Compile-Zeit (GNU C++)<br />
passieren und nicht zur Runtime.</p>
<p>Gibt es da einen eleganten Trick <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> ?</p>
<p>Ich könnte die siezeof(xstruct) 32 x nach rechts shiften und jedesmal<br />
mit sich selbst ORen und dann eins dazuzählen ... aber das ist hässlich!</p>
<p>Danke<br />
Markus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285441</guid><dc:creator><![CDATA[m-h-l]]></dc:creator><pubDate>Tue, 15 May 2007 14:27:47 GMT</pubDate></item><item><title><![CDATA[Reply to struct align auf nächste 2er Potenz in array on Wed, 16 May 2007 06:50:30 GMT]]></title><description><![CDATA[<p>Ob es wesentlich Geschwindigkeitsvorteile bringt, die Struktur größer als 8 Byte auszurichten, finde ich zwar fraglich. Aber wenn du unbedingt willst, kannst du sicher mit den Padding-Einstellungen des Compilers spielen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285872</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 16 May 2007 06:50:30 GMT</pubDate></item><item><title><![CDATA[Reply to struct align auf nächste 2er Potenz in array on Wed, 16 May 2007 06:59:20 GMT]]></title><description><![CDATA[<p>Nun, eine shift kostet normalerweise 1 Takt wohingegen in meinem<br />
System ein mul mindestens 5 oder mehr Takte benötigt ...</p>
<p>Sobald xstruct eine 2er-Potenz-Grösse hat braucht der der Array-Index<br />
halt nur mehr geshiftet werden:</p>
<p>Beispiel-Schlecht, sizeof(xstruct) = 88<br />
xstruct myArray[100];<br />
y = myArray[33]; // Assembler: ArrayElementOffset = 33 * 88;</p>
<p>Beispiel-Gut, sizeof(xstruct) = 128<br />
xstruct myArray[100];<br />
y = myArray[33]; // Assembler: ArrayElementOffset = 33 &lt;&lt; 7;</p>
<p>Letzteres ist deutlich schneller!</p>
<p>... aber wie krieg ich zu Compilezeit: sizeof(xstruct) = 2er-Potenz ???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285874</guid><dc:creator><![CDATA[m-h-l]]></dc:creator><pubDate>Wed, 16 May 2007 06:59:20 GMT</pubDate></item><item><title><![CDATA[Reply to struct align auf nächste 2er Potenz in array on Wed, 16 May 2007 07:07:07 GMT]]></title><description><![CDATA[<p>m-h-l schrieb:</p>
<blockquote>
<p>... aber wie krieg ich zu Compilezeit: sizeof(xstruct) = 2er-Potenz ???</p>
</blockquote>
<p>sizeof(xstruct) = ((echteGroesse*2)&gt;&gt;1)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285877</guid><dc:creator><![CDATA[egon2]]></dc:creator><pubDate>Wed, 16 May 2007 07:07:07 GMT</pubDate></item><item><title><![CDATA[Reply to struct align auf nächste 2er Potenz in array on Wed, 16 May 2007 12:23:42 GMT]]></title><description><![CDATA[<p>... sorry, das wird nicht klappen, damit kriege ich nur wieder<br />
die gleiche Grösse da x*2 &gt;&gt; 1 einmal links und dann wieder recht shift,<br />
das scheint mir ein sinnloses Konstrukt zu sein ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1286132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1286132</guid><dc:creator><![CDATA[m-h-l]]></dc:creator><pubDate>Wed, 16 May 2007 12:23:42 GMT</pubDate></item><item><title><![CDATA[Reply to struct align auf nächste 2er Potenz in array on Wed, 16 May 2007 12:25:17 GMT]]></title><description><![CDATA[<p>... ausserdem bezweifle ich das 'sizeof(xstruct)' ein gültiges<br />
lvalue ist ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1286135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1286135</guid><dc:creator><![CDATA[m-h-l]]></dc:creator><pubDate>Wed, 16 May 2007 12:25:17 GMT</pubDate></item></channel></rss>