<?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[Referenzen als Rückgabetyp bei inline-Methoden]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich habe eine wahrscheinlich eher triviale Frage. Ich habe aber dennoch nirgendwo die passende Antwort gefunden, weshalb ich sie nun hier stelle.</p>
<p>Ich würde also gerne wissen, ob bei einer inline-Methode, welche einen Wert zurück gibt, eigentlich auch tatsächlich zur Laufzeit eine Variable angelegt werden muss - oder wird diese bereits zur Übersetzungszeit angelegt? Bzw. etwas anders formuliert: Ist die zweite der unteren zwei Varianten möglicherweise &quot;schneller&quot;?</p>
<p>1. Variante (mit Variable):</p>
<pre><code class="language-cpp">class Pin {
	const static int total_number_of_pins=200;
	static bool *level[total_number_of_pins+1];
	const int pin_number;
public:
	explicit
	Pin(const int &amp;pin_number)
		: pin_number(this-&gt;pin_number) {
			this-&gt;level=static_cast&lt;bool *&gt;(MapMemory());
	};
	const bool &amp; get_level() const; //explicit inline
};

inline
const bool &amp; Pin::get_level() {
	return *(this-&gt;level+this-&gt;pin_number);
}
</code></pre>
<p>2. Variante (mit Referenz):</p>
<pre><code class="language-cpp">class Pin {
	const static int total_number_of_pins=200;
	static bool *level[total_number_of_pins+1];
	const int pin_number;
public:
	explicit
	Pin(const int &amp;pin_number)
		: pin_number(this-&gt;pin_number) {
			this-&gt;level=static_cast&lt;bool *&gt;(MapMemory());
	};
	const bool get_level() const; //explicit inline
};

inline
const bool Pin::get_level() {
	return *(this-&gt;level+this-&gt;pin_number);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/301047/referenzen-als-rückgabetyp-bei-inline-methoden</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 08:35:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301047.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 18 Mar 2012 01:07:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Referenzen als Rückgabetyp bei inline-Methoden on Sun, 18 Mar 2012 01:07:59 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich habe eine wahrscheinlich eher triviale Frage. Ich habe aber dennoch nirgendwo die passende Antwort gefunden, weshalb ich sie nun hier stelle.</p>
<p>Ich würde also gerne wissen, ob bei einer inline-Methode, welche einen Wert zurück gibt, eigentlich auch tatsächlich zur Laufzeit eine Variable angelegt werden muss - oder wird diese bereits zur Übersetzungszeit angelegt? Bzw. etwas anders formuliert: Ist die zweite der unteren zwei Varianten möglicherweise &quot;schneller&quot;?</p>
<p>1. Variante (mit Variable):</p>
<pre><code class="language-cpp">class Pin {
	const static int total_number_of_pins=200;
	static bool *level[total_number_of_pins+1];
	const int pin_number;
public:
	explicit
	Pin(const int &amp;pin_number)
		: pin_number(this-&gt;pin_number) {
			this-&gt;level=static_cast&lt;bool *&gt;(MapMemory());
	};
	const bool &amp; get_level() const; //explicit inline
};

inline
const bool &amp; Pin::get_level() {
	return *(this-&gt;level+this-&gt;pin_number);
}
</code></pre>
<p>2. Variante (mit Referenz):</p>
<pre><code class="language-cpp">class Pin {
	const static int total_number_of_pins=200;
	static bool *level[total_number_of_pins+1];
	const int pin_number;
public:
	explicit
	Pin(const int &amp;pin_number)
		: pin_number(this-&gt;pin_number) {
			this-&gt;level=static_cast&lt;bool *&gt;(MapMemory());
	};
	const bool get_level() const; //explicit inline
};

inline
const bool Pin::get_level() {
	return *(this-&gt;level+this-&gt;pin_number);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2192483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2192483</guid><dc:creator><![CDATA[DERBENUTZER]]></dc:creator><pubDate>Sun, 18 Mar 2012 01:07:59 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen als Rückgabetyp bei inline-Methoden on Sun, 18 Mar 2012 13:11:16 GMT]]></title><description><![CDATA[<p>Die Versionen sind mit Compileroptimierungen exakt gleich schnell.<br />
Aber um mal auf die Variante ohne Optimierungen einzugehen:<br />
&quot;Reservierungen&quot; auf dem Stack sind nichts weiter als Subtraktionen, das geht super schnell. Zudem liegt da alles hübsch hintereinander (das ist schön für den Cache) und Reservierungen erfolgen in Frames, nicht einzeln.</p>
<p>Die Referenz dagegen, im Falle dass sie nicht wegoptimiert wird, stellt nichts anderes als ein Pointer dar. Das ist eine Indirektion, und im schlimmsten Fall hast du auch noch einen Cache-Miss.</p>
<p>Daher: Alles was kleiner oder gleich 8 Byte groß ist (vielleicht auch noch mit 16/32, da fängt es aber an knapp zu werden), per value übergeben und zurückgeben. Referenzen machen da nur Sinn, wenn du lvalues brauchst.</p>
<p>PS: Das inlining machen Compiler heutzutage schon ganz gut alleine, da brauchst du nicht nachhelfen. Allerdings brauchst du es hier tatsächlich, um der one-definition-rule auszuweichen. (Wenn das so im Header steht.)</p>
<p>PPS: const auf rvalues macht sehr wenig Sinn, die sind per Definition sowas von const, da gibts nichts mehr zu verconsten. Mal versucht nem value-Rückgabewert etwas zuzuweisen?</p>
<p>PPPS: Du solltest das this-&gt; aus Stilgründen nur schreiben wenn du es brauchst. (Hier nie.)</p>
<p>PPPPS: level sollte hier eine eigene Klasse und kein Teil von Pin sein. Schachfiguren besitzen ja auch nicht das Brett, sie stehen nur drauf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2192485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2192485</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 18 Mar 2012 13:11:16 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen als Rückgabetyp bei inline-Methoden on Sun, 18 Mar 2012 13:02:33 GMT]]></title><description><![CDATA[<p>Hey cooky451,<br />
Vielen Dank für die Antwort, welche mein Problem eigentlich mehr als klärt.</p>
<p>Einzig den letzten Hinweis verstehe ich nicht so ganz.</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>PPPPS: level sollte hier eine eigene Klasse und kein Teil von Pin sein. Schachfiguren besitzen ja auch nicht das Brett, sie stehen nur drauf.</p>
</blockquote>
<p>Der Pin besitzt sein Level (High oder Low) aber sehr wohl, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2192514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2192514</guid><dc:creator><![CDATA[DERBENUTZER]]></dc:creator><pubDate>Sun, 18 Mar 2012 13:02:33 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen als Rückgabetyp bei inline-Methoden on Sun, 18 Mar 2012 13:13:09 GMT]]></title><description><![CDATA[<p>DERBENUTZER schrieb:</p>
<blockquote>
<p>Der Pin besitzt sein Level (High oder Low) aber sehr wohl, oder?</p>
</blockquote>
<p>Nein. Ein Level besitzt vielleicht die Pins, aber nicht umgekehrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2192515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2192515</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 18 Mar 2012 13:13:09 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen als Rückgabetyp bei inline-Methoden on Sun, 18 Mar 2012 14:36:28 GMT]]></title><description><![CDATA[<p>Ich finde ja die Pointer-Arithmetik hier etwas suspekt:</p>
<pre><code class="language-cpp">return *(this-&gt;level+this-&gt;pin_number);
</code></pre>
<p>Warum nicht</p>
<pre><code class="language-cpp">return level[pin_number];
</code></pre>
<p>?</p>
<p>Dann würde auch auffallen, dass da ein bool* rauskommt, kein bool.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2192528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2192528</guid><dc:creator><![CDATA[HyperSonic]]></dc:creator><pubDate>Sun, 18 Mar 2012 14:36:28 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen als Rückgabetyp bei inline-Methoden on Mon, 19 Mar 2012 16:11:09 GMT]]></title><description><![CDATA[<p>HyperSonic schrieb:</p>
<blockquote>
<p>Ich finde ja die Pointer-Arithmetik hier etwas suspekt:</p>
<pre><code class="language-cpp">return *(this-&gt;level+this-&gt;pin_number);
</code></pre>
<p>Warum nicht</p>
<pre><code class="language-cpp">return level[pin_number];
</code></pre>
<p>?</p>
<p>Dann würde auch auffallen, dass da ein bool* rauskommt, kein bool.</p>
</blockquote>
<p>Das ist in der Tat nicht gerade vom Feinsten. Es handelt sich aber sowieso nur um ein Beispiel ohne Sinn oder Zweck.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2192918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2192918</guid><dc:creator><![CDATA[DERBENUTZER]]></dc:creator><pubDate>Mon, 19 Mar 2012 16:11:09 GMT</pubDate></item></channel></rss>