<?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[keyword &amp;quot;volatile&amp;quot; und Kompiler-Optimierungen [solved]]]></title><description><![CDATA[<p>Hallo miteinander,</p>
<p>ich arbeite gerade das Buch &quot;Modernes C++ Design&quot; von Alexandrescu und die dazugehörige Bibliothek &quot;Loki&quot; durch und bin da gerade in Abschnitt 2.7 bzw. in &quot;TypeManip.h&quot; auf ein für mich nicht ganz verständliches Konstrukt gestoßen.</p>
<p>Es geht darum, die Vererbbarkeit bzw. Umwandelbarkeit eines Typs U in einen Typ T zur Kompile-Zeit zu bestimmen. Dazu definiert er eine Vorlagenklasse &quot;Conversion&quot;</p>
<pre><code class="language-cpp">template&lt;class T, class U&gt;
class Conversion
{
private:
	typedef char Small;
	class Big { char dummy[2]; };
	static Small Test( U );
	static Big Test( ... );
	static T MakeT();

public:
	enum { exists = sizeof( Test( MakeT() ) ) == sizeof( Small )};
	enum { sameType = false };
};

template&lt;class T&gt;
class Conversion&lt;T, T&gt;
{
public:
	enum { exists = 1, sameType = 1 };
};
</code></pre>
<p>Um die Implementierung zu Verstecken definiert er nun in o. g. header folgende Strukturen:</p>
<pre><code class="language-cpp">template &lt;class T, class U&gt;
struct SuperSubclass
{
  enum { value = (Conversion&lt;const volatile U*, const volatile T*&gt;::exists &amp;&amp;
                  !Conversion&lt;const volatile T*, const volatile void*&gt;::sameType) };
};

template&lt;class T,class U&gt;
struct SuperSubclassStrict
{
  enum { value = (Conversion&lt;const volatile U*, const volatile T*&gt;::exists &amp;&amp;
                 !Conversion&lt;const volatile T*, const volatile void*&gt;::sameType &amp;&amp;
                 !Conversion&lt;const volatile T*, const volatile U*&gt;::sameType) };
};
</code></pre>
<p>So wie ich die Beschreibung im Buch verstanden habe soll der Kompiler beim kompilieren Feststellen ob eine Umwandlung möglich ist oder nicht und der bei der Optimierung den Überschüssigen Code entfernen um das Programm &quot;schlank&quot; zu halten.</p>
<p>Soweit, so gut. Was mich nun irritiert ist das Schlüsselwort volatile in den Template parametern. Unterbindet nicht dieses Schlüsselwort derartige Optimierungen da es dem Kompieler einen Hinweis gibt, das die als volatile gekennzeichneten Variablen evt. von ausen geändert werden?</p>
<p>Kann mir bitte jemand einen Hinweis geben, wo ich gerade meinen Denkfehler habe?</p>
<p>Herzlichen Dank im Voraus.</p>
<p>Viele Grüße<br />
Knecht</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/169952/keyword-quot-volatile-quot-und-kompiler-optimierungen-solved</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 21:21:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/169952.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Jan 2007 13:19:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to keyword &amp;quot;volatile&amp;quot; und Kompiler-Optimierungen [solved] on Wed, 10 Jan 2007 16:46:15 GMT]]></title><description><![CDATA[<p>Hallo miteinander,</p>
<p>ich arbeite gerade das Buch &quot;Modernes C++ Design&quot; von Alexandrescu und die dazugehörige Bibliothek &quot;Loki&quot; durch und bin da gerade in Abschnitt 2.7 bzw. in &quot;TypeManip.h&quot; auf ein für mich nicht ganz verständliches Konstrukt gestoßen.</p>
<p>Es geht darum, die Vererbbarkeit bzw. Umwandelbarkeit eines Typs U in einen Typ T zur Kompile-Zeit zu bestimmen. Dazu definiert er eine Vorlagenklasse &quot;Conversion&quot;</p>
<pre><code class="language-cpp">template&lt;class T, class U&gt;
class Conversion
{
private:
	typedef char Small;
	class Big { char dummy[2]; };
	static Small Test( U );
	static Big Test( ... );
	static T MakeT();

public:
	enum { exists = sizeof( Test( MakeT() ) ) == sizeof( Small )};
	enum { sameType = false };
};

template&lt;class T&gt;
class Conversion&lt;T, T&gt;
{
public:
	enum { exists = 1, sameType = 1 };
};
</code></pre>
<p>Um die Implementierung zu Verstecken definiert er nun in o. g. header folgende Strukturen:</p>
<pre><code class="language-cpp">template &lt;class T, class U&gt;
struct SuperSubclass
{
  enum { value = (Conversion&lt;const volatile U*, const volatile T*&gt;::exists &amp;&amp;
                  !Conversion&lt;const volatile T*, const volatile void*&gt;::sameType) };
};

template&lt;class T,class U&gt;
struct SuperSubclassStrict
{
  enum { value = (Conversion&lt;const volatile U*, const volatile T*&gt;::exists &amp;&amp;
                 !Conversion&lt;const volatile T*, const volatile void*&gt;::sameType &amp;&amp;
                 !Conversion&lt;const volatile T*, const volatile U*&gt;::sameType) };
};
</code></pre>
<p>So wie ich die Beschreibung im Buch verstanden habe soll der Kompiler beim kompilieren Feststellen ob eine Umwandlung möglich ist oder nicht und der bei der Optimierung den Überschüssigen Code entfernen um das Programm &quot;schlank&quot; zu halten.</p>
<p>Soweit, so gut. Was mich nun irritiert ist das Schlüsselwort volatile in den Template parametern. Unterbindet nicht dieses Schlüsselwort derartige Optimierungen da es dem Kompieler einen Hinweis gibt, das die als volatile gekennzeichneten Variablen evt. von ausen geändert werden?</p>
<p>Kann mir bitte jemand einen Hinweis geben, wo ich gerade meinen Denkfehler habe?</p>
<p>Herzlichen Dank im Voraus.</p>
<p>Viele Grüße<br />
Knecht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1207108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207108</guid><dc:creator><![CDATA[Knecht]]></dc:creator><pubDate>Wed, 10 Jan 2007 16:46:15 GMT</pubDate></item><item><title><![CDATA[Reply to keyword &amp;quot;volatile&amp;quot; und Kompiler-Optimierungen [solved] on Wed, 10 Jan 2007 13:47:35 GMT]]></title><description><![CDATA[<p>Wenn ich das richtig ueberschaut habe testest du damit nur ob fuer U und T ohne Qualifier Conversion&lt;T,U&gt;::exitst true ergibt. Du definierst ja keine Variabeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1207130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207130</guid><dc:creator><![CDATA[Entenwickler]]></dc:creator><pubDate>Wed, 10 Jan 2007 13:47:35 GMT</pubDate></item><item><title><![CDATA[Reply to keyword &amp;quot;volatile&amp;quot; und Kompiler-Optimierungen [solved] on Wed, 10 Jan 2007 15:22:31 GMT]]></title><description><![CDATA[<p>Entenwickler schrieb:</p>
<blockquote>
<p>Wenn ich das richtig ueberschaut habe testest du damit nur ob fuer U und T ohne Qualifier Conversion&lt;T,U&gt;::exitst true ergibt. Du definierst ja keine Variabeln.</p>
</blockquote>
<p>Ja. Aber ich dachte wenn ich zur Zeit des Kompilierens zwei Typen U und T an eine der Strukturen übergebe, z. B.</p>
<pre><code class="language-cpp">bool possible = SuperSubclass&lt;U, T&gt;::value;
</code></pre>
<p>dann könnte ja der Kompiler den Ausdruck in der struct auswerten und direkt der variable possible zuweisen. Mit dem Schlüsselwort volatile kann er das nicht und muss den Ausdruck zur Laufzeit Auswerten, da volatile angibt dass sich die Variablen von aussen ändern können. Oder irre ich mich da?</p>
<p>Viele Grüße<br />
Knecht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1207190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207190</guid><dc:creator><![CDATA[Knecht]]></dc:creator><pubDate>Wed, 10 Jan 2007 15:22:31 GMT</pubDate></item><item><title><![CDATA[Reply to keyword &amp;quot;volatile&amp;quot; und Kompiler-Optimierungen [solved] on Wed, 10 Jan 2007 15:59:04 GMT]]></title><description><![CDATA[<p>Siehst denn irgendwo eine erstellte Variable?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1207221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207221</guid><dc:creator><![CDATA[Entenwickler]]></dc:creator><pubDate>Wed, 10 Jan 2007 15:59:04 GMT</pubDate></item><item><title><![CDATA[Reply to keyword &amp;quot;volatile&amp;quot; und Kompiler-Optimierungen [solved] on Wed, 10 Jan 2007 16:00:00 GMT]]></title><description><![CDATA[<p>Siehst denn irgendwo eine erstellte Variable?</p>
<p>Achja ausserdem werden ja templates IMMER zur Compilezeit instanziert und enums enthalten IMMER Konstanten, also MUSS es zur Compilezeit feststehen, sonst wird der Compiler schlecht gestimmt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1207223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207223</guid><dc:creator><![CDATA[Entenwickler]]></dc:creator><pubDate>Wed, 10 Jan 2007 16:00:00 GMT</pubDate></item><item><title><![CDATA[Reply to keyword &amp;quot;volatile&amp;quot; und Kompiler-Optimierungen [solved] on Wed, 10 Jan 2007 16:38:39 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/11987">@Knecht</a><br />
Du missinterpretierst das Schlüsselwort volatile. Dieses (genau wie das const) steht hier nur, damit der Test möglichst allgemein funktioniert. Zur Erinnerung: ein Zeiger auf T kann implizit in einen Zeiger auf c-v T konvertiert werden. Andersherum gibt es aber keine implizite Konvertierung.</p>
<p>Würde man auf die c-v-Qualifizierung verzichten, würde ein SuperSubclass&lt;Base, volatile Derived&gt;::value (oder SuperSubclass&lt;Base, const Derived&gt;::value) 0 liefern - was kein sonderlich intuitives Ergebnis wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1207264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207264</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Wed, 10 Jan 2007 16:38:39 GMT</pubDate></item><item><title><![CDATA[Reply to keyword &amp;quot;volatile&amp;quot; und Kompiler-Optimierungen [solved] on Wed, 10 Jan 2007 16:45:13 GMT]]></title><description><![CDATA[<p>Danke für die Hilfe! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Jetzt hab ich's glaub ich. Aus der Vorlagenklasse muss ja bei Kompilieren erst die Lauffähige Klasse aus den übergebenen Vorlagenargumenten zusammengebaut werden und dann kann der Kompiler rausschmeißen was er nicht mehr braucht. Oder?</p>
<p>Edit:<br />
Zu Spät!!!<br />
Ich ziehe die Frage &quot;Aber für was brauche ich dan die &quot;volatile&quot;s?&quot; zurück.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14924">@Entenwickler</a> und HumeSikkins:Danke für die Erklärung. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1207265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207265</guid><dc:creator><![CDATA[Knecht]]></dc:creator><pubDate>Wed, 10 Jan 2007 16:45:13 GMT</pubDate></item></channel></rss>