<?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[Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot;]]></title><description><![CDATA[<p>Hi,<br />
habe eben beim durchstöbern der VALVE Source Engine SDK folgendes gefunden: <a href="http://pastebin.com/KfQjK4vA" rel="nofollow">http://pastebin.com/KfQjK4vA</a></p>
<p>Wie kann das SetRawColor und GetRawColor denn bitte funktionieren? Sowas habe ich noch nie gesehen... Eine Erklärung würde mich interessieren.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/278716/frage-zu-quot-besonderem-quot-quot-hack-quot</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 01:23:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/278716.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 11 Dec 2010 21:09:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sat, 11 Dec 2010 21:09:50 GMT]]></title><description><![CDATA[<p>Hi,<br />
habe eben beim durchstöbern der VALVE Source Engine SDK folgendes gefunden: <a href="http://pastebin.com/KfQjK4vA" rel="nofollow">http://pastebin.com/KfQjK4vA</a></p>
<p>Wie kann das SetRawColor und GetRawColor denn bitte funktionieren? Sowas habe ich noch nie gesehen... Eine Erklärung würde mich interessieren.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993084</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sat, 11 Dec 2010 21:09:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sat, 11 Dec 2010 21:20:29 GMT]]></title><description><![CDATA[<p>Es wird davon ausgegangen, das im Speicherlayout des C++ Objekts, der Member _color an erster Stelle steht und via this direkt erreicht werden kann.</p>
<p>Diese Variante birgt einige Probleme, z.B. mit virtuellen Funktionen.<br />
Generell ist halt das Problem, dass die Implementierungsdetails vorausgesetzt werden.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993090</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 11 Dec 2010 21:20:29 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sat, 11 Dec 2010 21:28:53 GMT]]></title><description><![CDATA[<p>und was ist der sinn von:</p>
<pre><code class="language-cpp">#ifndef COLOR_H
#define COLOR_H

#ifdef _WIN32
#pragma once
#endif
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993092</guid><dc:creator><![CDATA[asdfasdfasdfasdf]]></dc:creator><pubDate>Sat, 11 Dec 2010 21:28:53 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sat, 11 Dec 2010 21:31:33 GMT]]></title><description><![CDATA[<p>Das pragma once ist überflüssig (ifndef reicht) und ist der MS Weg für Include Guards.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993095</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 11 Dec 2010 21:31:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sat, 11 Dec 2010 21:52:37 GMT]]></title><description><![CDATA[<p>asdfasdfasdfasdf schrieb:</p>
<blockquote>
<p>und was ist der sinn von:</p>
<pre><code class="language-cpp">#ifndef COLOR_H
#define COLOR_H

#ifdef _WIN32
#pragma once
#endif
</code></pre>
<p>?</p>
</blockquote>
<p>Manche Compiler haben bei pragma once auch noch spezielle Features, dass die Datei gar kein zweites Mal angefasst wird, was die Compilierungsgeschwindigkeit erhöht. Gute Compiler machen dies auch bei normalen Includeguards, die sie entsprechend erkennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993102</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 11 Dec 2010 21:52:37 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sat, 11 Dec 2010 22:21:23 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Gute Compiler machen dies auch bei normalen Includeguards, die sie entsprechend erkennen.</p>
</blockquote>
<p>Wie kann man die erkennen, ohne die ganze Datei zu parsen? Ein #ifndef-#define am Anfang muss ja nicht zwingend ein Headerguard sein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993106</guid><dc:creator><![CDATA[Kompiliererer]]></dc:creator><pubDate>Sat, 11 Dec 2010 22:21:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sat, 11 Dec 2010 22:28:55 GMT]]></title><description><![CDATA[<p>Danke für die Antworten! M.M.n. eine ziemlich &quot;riskante&quot; Sache. Wo wäre der Unterschied, wenn man einfach _color[0] schreiben würde? Es gäbe doch eigentlich keinen oder?!</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993109</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sat, 11 Dec 2010 22:28:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sat, 11 Dec 2010 22:37:30 GMT]]></title><description><![CDATA[<p>Kompiliererer schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Gute Compiler machen dies auch bei normalen Includeguards, die sie entsprechend erkennen.</p>
</blockquote>
<p>Wie kann man die erkennen, ohne die ganze Datei zu parsen? Ein #ifndef-#define am Anfang muss ja nicht zwingend ein Headerguard sein...</p>
</blockquote>
<p>Beim ersten Mal muss man ohnehin die ganze Datei einlesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993115</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 11 Dec 2010 22:37:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sat, 11 Dec 2010 22:41:59 GMT]]></title><description><![CDATA[<p>IMHo wäre es wirklich etwas sicherer</p>
<pre><code class="language-cpp">return *((int *)_color);
</code></pre>
<p>zu schreiben. Aber sicher ist noch gar nichts.<br />
Es ist nie gesagt, dass ein char genau 255 Werte annehmen kann. Besser (und genauso performant) ist daher, ein Bitfield zu verwenden.</p>
<pre><code class="language-cpp">unsigned int r : 8;
unsigned int g : 8;
unsigned int b : 8;
unsigned int a : 8;
</code></pre>
<p>Leider sagt immer noch niemand, dass das hintereinander liegen muss, wenn du sicher sein willst, dass es klappt, musst du in deinem autoconf-Script (oder was du auch immer verwendest) zur Compile-Time testen, ob vier Bytes in einen Integer passen und musst die einzelnen Werte per Bitshifting setzen. Tönt zwar inperformant, aber genau das macht der Compiler intern.</p>
<p>Jetzt ist die Frage, ob das etwas bringt und wenn du sehr oft auf die r,g,b,a-Werte zugreifst, bringt es effektiv nichts, die Umrechnung zu vereinfachen und zu verschnellern, wenn noch mehr Zeit beim Zugriff auf die Werte verlierst.</p>
<p>Fazit: Unperformanter Hack, unportabler Hack, schlechter Hack. Eigentlich hat das nicht einmal die Bezeichnung Hack verdient, da der einzige Zweck eine Erleichterung der Lesbarkeit darstellt und Hacks eher andersrum funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993116</guid><dc:creator><![CDATA[Salve]]></dc:creator><pubDate>Sat, 11 Dec 2010 22:41:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sun, 12 Dec 2010 01:21:38 GMT]]></title><description><![CDATA[<p>Man hätte hier auch einfach ne Union nehmen können.</p>
<p>Oder einen int/uint32_t Wert mit Rumshiften erzeugen/zerlegen.</p>
<p>Das Geshifte optimiert der Compiler im Endeffekt sowieso weg, von daher sollte das auch gleich performant sein.</p>
<p>Das wäre vermutlich die sauberste Variante.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993141</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 12 Dec 2010 01:21:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sun, 12 Dec 2010 05:47:34 GMT]]></title><description><![CDATA[<p>Das ist der Versuch alle 4 Bytes auf einmal zu setzen/lesen. <em>((int</em>)this) ist äquivalent zu reinterpret_cast&lt;int&amp;&gt;(*this). Der Der this-Zeiger wird einfach als int-Zeiger behandelt. Streng genommen ist das aus drei Gründen nicht erlaubt:<br />
1. Color ist kein POD<br />
2. Verletzung von §3.10/15 (Strinct-Aliasing)<br />
3. Folgendes kann nicht garantiert werden: alignof(Color)&gt;=alignof(int)</p>
<p>Richtig wär's mit memcpy und memset gewesen:</p>
<pre><code class="language-cpp">void SetRawColor(unsigned color32)
{
  memcpy(_color,&amp;color32,4);
}

unsingned GetRawColor() const
{
  unsigned r;
  memcpy(&amp;r,_color,4);
  return r;
}
</code></pre>
<p>oder alternativ das Speichern als int:</p>
<pre><code class="language-cpp">public:
  void SetRawColor(uint32_t color32)
  { color32_ = color32; }

  uint32_t GetRawColor() const
  { return color32_; }

  unsigned char&amp; operator[](int idx) {
    // ist nach §3.10/15 erlaubt
    unsigned char* p = reinterpret_cast&lt;unsigned char*&gt;(&amp;color32_);
    return p[idx];
  }

  unsigned char operator[](int idx) const {
    // ist nach §3.10/15 erlaubt
    unsigned char* p = reinterpret_cast&lt;unsigned char*&gt;(&amp;color32_);
    return p[idx];
  }

private:
  uint32_t color32_;
</code></pre>
<p>u.s.w.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993152</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 12 Dec 2010 05:47:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sun, 12 Dec 2010 08:46:21 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Man hätte hier auch einfach ne Union nehmen können.</p>
</blockquote>
<p>Das ist nicht erlaubt, weil immer nur auf den letzten geschriebenen Wert lesend zugegriffen werden darf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993158</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 12 Dec 2010 08:46:21 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sun, 12 Dec 2010 09:16:52 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Man hätte hier auch einfach ne Union nehmen können.</p>
</blockquote>
<p>Das ist nicht erlaubt, weil immer nur auf den letzten geschriebenen Wert lesend zugegriffen werden darf.</p>
</blockquote>
<p>Der berühmte Union Trick...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993168</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 12 Dec 2010 09:16:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sun, 12 Dec 2010 10:20:26 GMT]]></title><description><![CDATA[<pre><code>union
{
 uint32_t color32;
 uint8_t color8[4];
}
</code></pre>
<p>Weshalb ist das hier denn nun genau so &quot;verboten&quot;?<br />
Warum darf nur auf den zuletzt geschriebenen Wert zugegriffen werden?<br />
Weil du es sagst? Oder wurde das in der EULA der source sdk festgelegt. Oder hat das etwa religiöse Hintergründe? O_o<br />
Oder gibt es da einen c++ basierenden Grund? Eventuell weil man nicht sicher sagen kann ob der Compiler die 8-bit Typen auf 32bit (oder 64) aligned?</p>
<p>Es schaut mir jedenfalls alles besser aus als das Original im ersten Post.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993184</guid><dc:creator><![CDATA[Osbios]]></dc:creator><pubDate>Sun, 12 Dec 2010 10:20:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sun, 12 Dec 2010 10:36:59 GMT]]></title><description><![CDATA[<p>Osbios schrieb:</p>
<blockquote>
<p>Oder gibt es da einen c++ basierenden Grund?</p>
</blockquote>
<p>Ja. Der C++ Standard garantiert nicht, dass das so funktioniert, wie Du Dir das denkst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993189</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 12 Dec 2010 10:36:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sun, 12 Dec 2010 12:19:31 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Osbios schrieb:</p>
<blockquote>
<p>Oder gibt es da einen c++ basierenden Grund?</p>
</blockquote>
<p>Ja. Der C++ Standard garantiert nicht, dass das so funktioniert, wie Du Dir das denkst.</p>
</blockquote>
<p>Ok, wieder etwas dazu gelernt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993248</guid><dc:creator><![CDATA[Osbios]]></dc:creator><pubDate>Sun, 12 Dec 2010 12:19:31 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sun, 12 Dec 2010 12:40:18 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Osbios schrieb:</p>
<blockquote>
<p>Oder gibt es da einen c++ basierenden Grund?</p>
</blockquote>
<p>Ja. Der C++ Standard garantiert nicht, dass das so funktioniert, wie Du Dir das denkst.</p>
</blockquote>
<p>Der ein oder andere Compiler kann natürlich diese Garantie geben. So ist es zB beim GCC. Der GCC erlaubt den union-hack explizit. Er ist aber wie gesagt nicht Standard.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993262</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 12 Dec 2010 12:40:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu &amp;quot;besonderem&amp;quot; &amp;quot;Hack&amp;quot; on Sun, 12 Dec 2010 20:33:29 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Man hätte hier auch einfach ne Union nehmen können.</p>
</blockquote>
<p>Das ist nicht erlaubt, weil immer nur auf den letzten geschriebenen Wert lesend zugegriffen werden darf.</p>
</blockquote>
<p>Ja, ist nicht erlaubt. Funktioniert aber genau so gut oder schlecht wie einfach &quot;this&quot; zu casten, und ist IMO zumindest weniger verwirrend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993474</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 12 Dec 2010 20:33:29 GMT</pubDate></item></channel></rss>