<?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[Inline Ersetzung funzt nicht 100%]]></title><description><![CDATA[<p>Hallo,</p>
<p>Folgende Problemstellung:</p>
<pre><code class="language-cpp">class Integer
{
public:
	Integer(void); 
	Integer(const int value);
	Integer(const Integer &amp;var);
	~Integer(void);

        int operator + (Integer var) const;

	const Float sepp() const;
// cast operatoren
	operator Float() const; // kein schreibfehler!!! Float pendant zu float wie Integer zu int

private:
	int value;
};

inline const Float Integer::sepp() const{
	return value;
}

inline int Integer::operator + (Integer var) const
{
	return (this-&gt;value + var.value);
}

//V 1
inline Integer::operator Float() const
{	
	const Float puff(value);
	return puff;
}
//V 2 (liefern beide das gleiche problem)
inline Integer::operator Float() const
{
	return value;
}
</code></pre>
<p>Diese Klasse ist natuerlich noch groesser, was aber fuer die Frage belanglos ist.<br />
Main vollstaendig:</p>
<pre><code class="language-cpp">int main(void)
{
	Integer i(5);
	Integer j(6);
	Float f(3.7f);
	Char *c = new Char[100];
	Double d(7.3849);
	Double dd(2.4233);
	utils::StopWatch *sw = new utils::StopWatch();
	volatile int k=0;
	double time;
	ofstream file(&quot;inlineRTTI.csv&quot;, ios::out|ios::binary|ios::beg);
	int l=0;
	while (l &lt; 100)
	{
		sw-&gt;reset();
		sw-&gt;start();
		while(k &lt; 4000000000)
		{
			i += 1;
			i += j+2;
			i -= 3;
			i -= j+3;
			i *= 4;
			--i;
			i *= j+4;
			i /= 6;
			i /= j+5;
			++i; 

			f +=   (Float) i; // &lt;------ !!!!!!!!!!! operator Float() const 
			f = f + 0.3f;
			f += 2.1f;
			f -= 1.2f;
			f /= 0.234f;

			c[0] = i+1;
			c[1] = i+2;

			if (i == j)
				f  = 9.34f;
			else
				i = 345;

			d /= dd;
			d *= dd;
			d += dd;
			d -= dd; //*/

			++k;
		}

		time = sw-&gt;getTime();
		file &lt;&lt; time &lt;&lt; &quot;;&quot; &lt;&lt; endl;
		k=0;
		++l;
	}
	file.close();
	cout &lt;&lt; i &lt;&lt; j &lt;&lt; c &lt;&lt; f &lt;&lt; d &lt;&lt; dd;
/*	cout &lt;&lt; &quot;fertig&quot; &lt;&lt; endl;
	char fake[100];
	cin &gt;&gt; fake;*/
	return 0;
}
</code></pre>
<p>Bei der makierten Zeile wird entsprechend der cast operator Aufgerufen. Dieser ist allerdings Inline definiert und sollte bei den entsprechenden optimierungseinstellungen ersetzt werden.</p>
<p>Ich benutze den VC++ 7, mit den einstellungen:<br />
Full Optimization (/Ox)<br />
Global Optimizations yes (/Og)<br />
Inline Function Expansion only _inline ODER any siutable<br />
Favor Fast Code</p>
<p>Die Inline Ersetzung sollte also an sein. Bei funktionen die eine Referenz auf sich selbst zurueckgeben und ansonsten nicht viel machen (siehe operator +) passiert dies auch, nur bei dem Cast operator bzw. bei Methoden die Beispielsweise in der Methodendefinition Objekte erstellen (siehe operator Float() const) wird immer noch ein call (sowohl Variante V1 als auch V2 und bei Integer::sepp()) ausgefuehrt:</p>
<pre><code>; 50   : 			f +=   (Float) i;

	lea	ecx, DWORD PTR $T109043[esp+216]
	lea	esi, DWORD PTR [edx+eax+1]
	push	ecx
	lea	ecx, DWORD PTR _i$[esp+220]
	mov	DWORD PTR _i$[esp+220], esi
	call	??BInteger@@QBE?AVFloat@@XZ		; Integer::operator Float &lt;-- das ist schlecht / langsam

; 50   : 			f +=   i.sepp();
	lea	ecx, DWORD PTR $T109036[esp+224]
	lea	esi, DWORD PTR [edx+eax+1]
	push	ecx
	lea	ecx, DWORD PTR _i$[esp+228]
	mov	DWORD PTR _i$[esp+228], esi
	call	?sepp@Integer@@QBE?BVFloat@@XZ		; Integer::sepp &lt;-- analog zu oberen
</code></pre>
<p>gibt es eine Moeglichkeit die Methoden anders zu formulieren so dass entsprechend eine ersetzung anstatt eines sprunges vorgenommen wird / bzw gibt es eine Kompilereinstellung die dies bezweckt? (die Klasse soll in Float castbar sein (nicht float))</p>
<p>(der call macht die ganze sache ziemlich langsam)</p>
<p>thx for help[code]</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/132499/inline-ersetzung-funzt-nicht-100</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 13:14:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/132499.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Jan 2006 12:13:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Inline Ersetzung funzt nicht 100% on Wed, 11 Jan 2006 12:13:28 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Folgende Problemstellung:</p>
<pre><code class="language-cpp">class Integer
{
public:
	Integer(void); 
	Integer(const int value);
	Integer(const Integer &amp;var);
	~Integer(void);

        int operator + (Integer var) const;

	const Float sepp() const;
// cast operatoren
	operator Float() const; // kein schreibfehler!!! Float pendant zu float wie Integer zu int

private:
	int value;
};

inline const Float Integer::sepp() const{
	return value;
}

inline int Integer::operator + (Integer var) const
{
	return (this-&gt;value + var.value);
}

//V 1
inline Integer::operator Float() const
{	
	const Float puff(value);
	return puff;
}
//V 2 (liefern beide das gleiche problem)
inline Integer::operator Float() const
{
	return value;
}
</code></pre>
<p>Diese Klasse ist natuerlich noch groesser, was aber fuer die Frage belanglos ist.<br />
Main vollstaendig:</p>
<pre><code class="language-cpp">int main(void)
{
	Integer i(5);
	Integer j(6);
	Float f(3.7f);
	Char *c = new Char[100];
	Double d(7.3849);
	Double dd(2.4233);
	utils::StopWatch *sw = new utils::StopWatch();
	volatile int k=0;
	double time;
	ofstream file(&quot;inlineRTTI.csv&quot;, ios::out|ios::binary|ios::beg);
	int l=0;
	while (l &lt; 100)
	{
		sw-&gt;reset();
		sw-&gt;start();
		while(k &lt; 4000000000)
		{
			i += 1;
			i += j+2;
			i -= 3;
			i -= j+3;
			i *= 4;
			--i;
			i *= j+4;
			i /= 6;
			i /= j+5;
			++i; 

			f +=   (Float) i; // &lt;------ !!!!!!!!!!! operator Float() const 
			f = f + 0.3f;
			f += 2.1f;
			f -= 1.2f;
			f /= 0.234f;

			c[0] = i+1;
			c[1] = i+2;

			if (i == j)
				f  = 9.34f;
			else
				i = 345;

			d /= dd;
			d *= dd;
			d += dd;
			d -= dd; //*/

			++k;
		}

		time = sw-&gt;getTime();
		file &lt;&lt; time &lt;&lt; &quot;;&quot; &lt;&lt; endl;
		k=0;
		++l;
	}
	file.close();
	cout &lt;&lt; i &lt;&lt; j &lt;&lt; c &lt;&lt; f &lt;&lt; d &lt;&lt; dd;
/*	cout &lt;&lt; &quot;fertig&quot; &lt;&lt; endl;
	char fake[100];
	cin &gt;&gt; fake;*/
	return 0;
}
</code></pre>
<p>Bei der makierten Zeile wird entsprechend der cast operator Aufgerufen. Dieser ist allerdings Inline definiert und sollte bei den entsprechenden optimierungseinstellungen ersetzt werden.</p>
<p>Ich benutze den VC++ 7, mit den einstellungen:<br />
Full Optimization (/Ox)<br />
Global Optimizations yes (/Og)<br />
Inline Function Expansion only _inline ODER any siutable<br />
Favor Fast Code</p>
<p>Die Inline Ersetzung sollte also an sein. Bei funktionen die eine Referenz auf sich selbst zurueckgeben und ansonsten nicht viel machen (siehe operator +) passiert dies auch, nur bei dem Cast operator bzw. bei Methoden die Beispielsweise in der Methodendefinition Objekte erstellen (siehe operator Float() const) wird immer noch ein call (sowohl Variante V1 als auch V2 und bei Integer::sepp()) ausgefuehrt:</p>
<pre><code>; 50   : 			f +=   (Float) i;

	lea	ecx, DWORD PTR $T109043[esp+216]
	lea	esi, DWORD PTR [edx+eax+1]
	push	ecx
	lea	ecx, DWORD PTR _i$[esp+220]
	mov	DWORD PTR _i$[esp+220], esi
	call	??BInteger@@QBE?AVFloat@@XZ		; Integer::operator Float &lt;-- das ist schlecht / langsam

; 50   : 			f +=   i.sepp();
	lea	ecx, DWORD PTR $T109036[esp+224]
	lea	esi, DWORD PTR [edx+eax+1]
	push	ecx
	lea	ecx, DWORD PTR _i$[esp+228]
	mov	DWORD PTR _i$[esp+228], esi
	call	?sepp@Integer@@QBE?BVFloat@@XZ		; Integer::sepp &lt;-- analog zu oberen
</code></pre>
<p>gibt es eine Moeglichkeit die Methoden anders zu formulieren so dass entsprechend eine ersetzung anstatt eines sprunges vorgenommen wird / bzw gibt es eine Kompilereinstellung die dies bezweckt? (die Klasse soll in Float castbar sein (nicht float))</p>
<p>(der call macht die ganze sache ziemlich langsam)</p>
<p>thx for help[code]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963473</guid><dc:creator><![CDATA[ADOOM]]></dc:creator><pubDate>Wed, 11 Jan 2006 12:13:28 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Ersetzung funzt nicht 100% on Wed, 11 Jan 2006 12:31:00 GMT]]></title><description><![CDATA[<p>Nunja, inline ist ja nur eine Empfehlung an den Compiler. Ob er wirklich inlined, ist letztendlich seine Sache. Den einzigen Tipp, den ich dir im Moment geben kann, ist, probier es mal mit Compilerflag /O2 statt /Ox. Ansonsten wäre da noch __forceinline, ist allerdings compilerspezifisch und der MSC wird das vermutlich auch nicht grossartig anders handeln als inline.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963485</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Wed, 11 Jan 2006 12:31:00 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Ersetzung funzt nicht 100% on Wed, 11 Jan 2006 12:41:11 GMT]]></title><description><![CDATA[<p>beide Optimierungsstufen wie auch __forceinline und __inline machen genau das gleiche</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963500</guid><dc:creator><![CDATA[ADOOM]]></dc:creator><pubDate>Wed, 11 Jan 2006 12:41:11 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Ersetzung funzt nicht 100% on Wed, 11 Jan 2006 13:16:04 GMT]]></title><description><![CDATA[<p>inline ist nur eine Empfehlung - wenn der Compiler meint, daß dein Programm ohne inline schneller ist, wird er die Funktion in jedem Fall normal erstellen.</p>
<p>Und der operator Float scheint so ein Kandidat zu sein (könnte mit der impliziten Typ-Umwandlung zusammenhängen - oder hast du einen Float::Float(int) Ctor?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963543</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Wed, 11 Jan 2006 13:16:04 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Ersetzung funzt nicht 100% on Wed, 11 Jan 2006 13:21:06 GMT]]></title><description><![CDATA[<p>ne hat ich nicht aber natuerlich ein Float(float) und da es auch einen Integer::operator int() gibt macht er bei<br />
Integer i(5);<br />
Float f = i;<br />
auch den weg ueber die kette<br />
Integer-&gt;int-&gt;float-&gt;Float<br />
was aber nicht sinn und zweck der sache ist da ja von int und float abstrahiert werden soll. deswegen sollte ein Integer-&gt;Float moeglich sein<br />
mit</p>
<p>inline Integer::operator const Float &amp;() const<br />
{<br />
const Float puff(value);<br />
const Float &amp; boing = puff;<br />
return boing;<br />
}</p>
<p>macht ers jetzt richtig <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /><br />
problem geloest</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963549</guid><dc:creator><![CDATA[ADOOM]]></dc:creator><pubDate>Wed, 11 Jan 2006 13:21:06 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Ersetzung funzt nicht 100% on Wed, 11 Jan 2006 13:36:12 GMT]]></title><description><![CDATA[<p>ADOOM schrieb:</p>
<blockquote>
<p>auch den weg ueber die kette<br />
Integer-&gt;int-&gt;float-&gt;Float</p>
</blockquote>
<p>Solange du keine direkte Umwandlung definierst, gehst du auf jeden Fall über diese Kette.</p>
<blockquote>
<pre><code class="language-cpp">inline Integer::operator const Float &amp;() const
{	
	const Float puff(value);
	const Float &amp; boing = puff;
	return boing;
}
</code></pre>
</blockquote>
<p>Auch wenn du dir die zusätzliche Referenz dort sparen könntest - das ist auch eine Möglichkeit.</p>
<p>PS: Ist es dir wirklich so wichtig, was da im Untergrund passiert? Wenn es dir so auf Geschwindigkeit ankommt, verzichte lieber auf die Wrapper-Klassen.</p>
<p>PPS: Schonmal Optimierung auf Größe (/Os) versucht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963568</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Wed, 11 Jan 2006 13:36:12 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Ersetzung funzt nicht 100% on Wed, 11 Jan 2006 13:47:03 GMT]]></title><description><![CDATA[<p>1. jop die Wrapper sind absicht<br />
2. die wrapper waren bisher genauso schnell wie die entsprechenden primitiven datentypen<br />
3. wenns nicht langsamer waere (faktor 10) waer der thread auch nicht hier entstanden (die kompilersettings auf speed etc. habe ich natuerlich auch vorher probiert)</p>
<p>wenns so ist wie bisher sollten diese wrapper klassen vom speed her identisch sein mit den primitiven typen (alles deutet im mom darauf hin)</p>
<p>thx</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963579</guid><dc:creator><![CDATA[ADOOM]]></dc:creator><pubDate>Wed, 11 Jan 2006 13:47:03 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Ersetzung funzt nicht 100% on Wed, 11 Jan 2006 14:14:22 GMT]]></title><description><![CDATA[<p>BTW:<br />
<a href="http://turing.fh-landshut.de/~jamann/inline.PNG" rel="nofollow">http://turing.fh-landshut.de/~jamann/inline.PNG</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/963626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963626</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Wed, 11 Jan 2006 14:14:22 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Ersetzung funzt nicht 100% on Wed, 11 Jan 2006 14:16:24 GMT]]></title><description><![CDATA[<p>es wurde MsVC 7.1 (2003 Net) verwendet - Professional Edition</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963628</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Wed, 11 Jan 2006 14:16:24 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Ersetzung funzt nicht 100% on Wed, 11 Jan 2006 18:51:24 GMT]]></title><description><![CDATA[<p>ADOOM schrieb:</p>
<blockquote>
<p>beide Optimierungsstufen wie auch __forceinline und __inline machen genau das gleiche</p>
</blockquote>
<p>fast. ich bin ein einziges mal bewusst über einen fall gestolpert, bei dem __forceinline tatsächlich etwas genutzt hat.</p>
<p>der grund, warum vc++7.1 hier den operator nicht inlined, hat mit exceptions zu tun. eine function, die ein objekt mit nicht-trivialem destruktor zurück gibt, wird niemals inline-expandiert (selbst wenn die funtion und alle member funktionen des objekts mit leerer exception-spezifikation definiert wird). in diesem falle ist ein selbst definierter destruktor allerdings auch völlig überflüssig...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963962</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 11 Jan 2006 18:51:24 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Ersetzung funzt nicht 100% on Wed, 11 Jan 2006 20:09:31 GMT]]></title><description><![CDATA[<blockquote>
<pre><code class="language-cpp">inline Integer::operator const Float &amp;() const
{	
	const Float puff(value);
	const Float &amp; boing = puff;
	return boing;
}
</code></pre>
</blockquote>
<p>eine referenz auf eine locale variable zurückgeben? wohl kaum...<br />
man könnte eine statische variable verwenden:</p>
<blockquote>
<pre><code class="language-cpp">inline Integer::operator const Float &amp;() const
{	
	static Float puff;
        puff = value;
	return puff;
}
</code></pre>
</blockquote>
<p>aber die funktion ist dann nicht mehr reentrant - und das ist bei konvertierungsoperatoren so gut wie immer inakzeptabel. eine referenz zurückzugeben, wenn es ein objekt sein muss ist immer ein fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/964006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/964006</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 11 Jan 2006 20:09:31 GMT</pubDate></item></channel></rss>