<?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[&amp;amp;Referenz und *Pointer]]></title><description><![CDATA[<p>Servus,</p>
<p>habe hier schon öfters gelesen, daß es einen Unterschied macht, ob man eine Referenz oder einen Pointer übergibt.</p>
<p>Daraufhin habe ich mal ein kleines Testprogramm geschrieben und nach dem Kompilieren disassembliert, allerdings kommt exakt der gleiche Code dabei raus.</p>
<p>Kann das nun an einer Compiler-Optimierung liegen? Oder äußert sich der Unterschied womöglich nur in der Programmierung und nicht im fertig kompilierten Programm? Oder wäre es vielleicht anders kompiliert worden, wenn in der aufgerufenen Funktion noch mehr passieren würde?</p>
<p>Hier ist der Code (in der Pointer-Version):</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

class Test
{
public:
    Test(int _a, int _b) : a(_a), b(_b)
    {

    }

    int getA()
    {
        return a;
    }

    int getB()
    {
        return b;
    }

private:
    int a;
    int b;
};

int sum(Test* test)
{
    printf(&quot;Jetzt wird die Summe berechnet\n&quot;);
    return test-&gt;getA() + test-&gt;getB();
}

int main()
{
    printf(&quot;Hier geht's los!\n&quot;);
    Test test = Test(50, 30);

    int s = sum(&amp;test);
    printf(&quot;%i\n&quot;, s);

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/187783/amp-referenz-und-pointer</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 19:43:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/187783.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Jul 2007 06:02:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 06:02:33 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>habe hier schon öfters gelesen, daß es einen Unterschied macht, ob man eine Referenz oder einen Pointer übergibt.</p>
<p>Daraufhin habe ich mal ein kleines Testprogramm geschrieben und nach dem Kompilieren disassembliert, allerdings kommt exakt der gleiche Code dabei raus.</p>
<p>Kann das nun an einer Compiler-Optimierung liegen? Oder äußert sich der Unterschied womöglich nur in der Programmierung und nicht im fertig kompilierten Programm? Oder wäre es vielleicht anders kompiliert worden, wenn in der aufgerufenen Funktion noch mehr passieren würde?</p>
<p>Hier ist der Code (in der Pointer-Version):</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

class Test
{
public:
    Test(int _a, int _b) : a(_a), b(_b)
    {

    }

    int getA()
    {
        return a;
    }

    int getB()
    {
        return b;
    }

private:
    int a;
    int b;
};

int sum(Test* test)
{
    printf(&quot;Jetzt wird die Summe berechnet\n&quot;);
    return test-&gt;getA() + test-&gt;getB();
}

int main()
{
    printf(&quot;Hier geht's los!\n&quot;);
    Test test = Test(50, 30);

    int s = sum(&amp;test);
    printf(&quot;%i\n&quot;, s);

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1331236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331236</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Tue, 24 Jul 2007 06:02:33 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 06:15:21 GMT]]></title><description><![CDATA[<p>Wie Referenzen technisch umgesetzt werden, ist eine Angelegenheit des Compilers. Und da ist es durchaus üblich, sie intern wieder als Zeiger zu implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1331243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331243</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 24 Jul 2007 06:15:21 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 06:19:02 GMT]]></title><description><![CDATA[<p>Hmmm okay, und was sind dann nochmal die genauen Unterschiede, bzw. wann sollte ich was verwenden? Da es ja nun nicht zwingend mit effizientem Maschinencode zu tun haben muß, wäre es interessant zu wissen, wo nun die Vor- und Nachteile liegen. Hab schon mehrmals drüber gelesen aber es bisher noch nie so &quot;richtig&quot; geschnallt.</p>
<p>Übrigens, ich habe auch mal versucht, eine const-Referenz zu übergeben, aber das wollte er mir nicht kompilieren... Wie müßte ich denn das Objekt dazu übergeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1331245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331245</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Tue, 24 Jul 2007 06:19:02 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 06:24:30 GMT]]></title><description><![CDATA[<p>Das verwirrt mich jetzt etwas. Meines Wissens haben Referenzen (zur Laufzeit) keinen Speicher, es wird mit dem Speicherer (Variable) gearbeitet, womit die Referenz initialisiert wurde. Man kann sie ja auch als ein Alias ansehen.<br />
Wie genau meinst du das, dass diese wieder als Zeiger implementiert werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1331247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331247</guid><dc:creator><![CDATA[TLEP]]></dc:creator><pubDate>Tue, 24 Jul 2007 06:24:30 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 06:27:04 GMT]]></title><description><![CDATA[<p>Eine Referenz &quot;zeigt&quot; während ihrer gesamten Lebenszeit auf genau EIN Objekt (und es ist aus C++ Sicht auch nicht möglich, an dieser Verbindung etwas zu ändern). Ein Zeiger kann beliebig umgebogen werden (oder auf NULL gesetzt). Außerdem kannst du mit Referenzen keine Adress-Arithmetik betreiben.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/37945">@const</a>: ein 'const Test&amp;' ist eine Referenz auf ein <em>konstantes</em> Objekt - bei dem kannst du die Methoden getA() und getB() nicht verwenden, weil sie nicht als const gekennzeichnet sind.</p>
<pre><code class="language-cpp">class Test
{
public:
    ...    
    int getA() /*hier:*/ const
    {
        return a;
    }
    ...
};
</code></pre>
<p>Edit: <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16570">@TLEP</a>: Aus C++ Sicht sind Referenzen &quot;nur&quot; ein Alias für eine andere Variable. Aber der Compiler muß das auch auf eine Art darstellen, die dein Rechner versteht - und wenn der keine eingebauten Referenzen hat, werden dafür hinter den Kulissen wieder Zeiger verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1331248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331248</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 24 Jul 2007 06:27:04 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 06:26:46 GMT]]></title><description><![CDATA[<p>Ahhh okay, dann hab ich das mit const schonmal verstanden <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="🙂"
    /></p>
<p>Das andere noch nicht ganz - okay, daß Pointer Variablen sind und Referenzen die Adressen ist mir eigentlich klar, aber in welchen Fällen spricht es dann dafür, tatsächlich eine Referenz zu verwenden und nicht einfach einen Pointer (was ich bisher eigentlich grundsätzlich gemacht habe)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1331250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331250</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Tue, 24 Jul 2007 06:26:46 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 06:33:44 GMT]]></title><description><![CDATA[<p>Ich hatte immer gedacht, dass wenn man mit einer Referenz arbeitet, genau mit dem Objekt arbeit, wo die Referenz &quot;draufzeigt&quot;. Also das nicht mit einem Zieger auf das Objekt, sonder mit dem Objekt selbst.<br />
Frage: Wenn man eine Referenz als Parameter einer Funktion implementiert, werden die Parameter noch auf den Stack gepusht? Würde ja eigentlich keinen Sinn machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1331251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331251</guid><dc:creator><![CDATA[TLEP]]></dc:creator><pubDate>Tue, 24 Jul 2007 06:33:44 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 06:36:26 GMT]]></title><description><![CDATA[<p>Naja eigentlich muß das schon passieren, schließlich weiß die Funktion ja sonst nicht, welches Objekt sie benutzen soll. Du kannst ja trotz allem die Funktion mit zig verschiedenen Objekten aufrufen, daher muß sie zumindest die Adresse haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1331252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331252</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Tue, 24 Jul 2007 06:36:26 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 06:37:58 GMT]]></title><description><![CDATA[<p>Wenn du sicher sein willst/bist, daß immer eine gültige Variable hinter dem Verweis steckt, nimmst du lieber eine Referenz (das ist in C++ wohl häufiger der Fall - gerade bei Funktionsparametern).</p>
<p>Pointer solltest du nur verwenden, wenn in einer Situation keine Referenzen nutzbar sind:</p>
<ul>
<li>das Ziel des Verweises kann sich während seiner Lebenszeit ändern (Anmerkung: das betrifft übrigens keine Funktionsparameter, die bei jedem Aufruf woanders hinzeigen könnten)</li>
<li>du brauchst eine Möglichkeit, auf &quot;nichts&quot; zu verweisen (es gibt keine NULL-Referenzen</li>
<li>hinter dem Verweis steckt kein einzelnes Objekt, sondern ein komplettes Array</li>
</ul>
<p>(btw, ein häufiges Anwendungsfeld von Pointern ist dynamische Speicherverwaltung)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1331253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331253</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 24 Jul 2007 06:37:58 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 06:50:13 GMT]]></title><description><![CDATA[<p>Hallo,<br />
irgendwie sind Referenzen bisher spurlos an mir vorbeigegangen(Außer bei Funktionparametern)<br />
In folgendem Code bspw. hätte ich wahrscheinlich eher ne Face-Referenz als nen Face-Pointer verwenden sollen oder ?<br />
Der Code ist einfach nur aus einem größeren Zusammenhang ausgeschnitten, also bitte nicht den Sinn hinterfragen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<pre><code class="language-cpp">for(unsigned int i = 0; i&lt; a.adjacentFaces.size();i++){
    Face *myFace = &amp;FaceMap[a.adjacentFaces[i&rsqb;&rsqb;;
	if(a.index == myFace-&gt;x){
		if(b.index == myFace-&gt;y || b.index == myFace-&gt;z){
		FaceMap.erase(i);
		}
		else{
		myFace-&gt;x = b.index;
		}
        }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1331258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331258</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Tue, 24 Jul 2007 06:50:13 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 07:43:43 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Edit: <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16570">@TLEP</a>: Aus C++ Sicht sind Referenzen &quot;nur&quot; ein Alias für eine andere Variable. Aber der Compiler muß das auch auf eine Art darstellen, die dein Rechner versteht - und wenn der keine eingebauten Referenzen hat, werden dafür hinter den Kulissen wieder Zeiger verwendet.</p>
</blockquote>
<p>Nicht unbedingt. In folgendem Code z.B. würde ich erwarten (ungetestet), dass der Compiler bitte *keinen* Zeiger anlegt:</p>
<pre><code class="language-cpp">{
    int a = 5;
    int&amp; ra = a;
    ra = 6;
}
</code></pre>
<p>Hier einen Zeiger anzulegen ist ein vollkommen unnützes Overhead, 'ra' ist hier ein echtes Alias und der Compiler wird wahrscheinlich für 'ra' dasselbe Symbol wie für 'a' ausspucken und die Initialisierung von 'ra' entfernen.</p>
<p>(Sobald eine neue Stack Frame angelegt wird, geht das natürlich nicht mehr, da muss ein Zeiger erzeugt werden.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1331272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331272</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Tue, 24 Jul 2007 07:43:43 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 07:40:09 GMT]]></title><description><![CDATA[<p>Blue5teel schrieb:</p>
<blockquote>
<p>...<br />
In folgendem Code bspw. hätte ich wahrscheinlich eher ne Face-Referenz als nen Face-Pointer verwenden sollen oder ? ...</p>
</blockquote>
<p>Naja, das ist ja ein klassisches Beispiel dafür, dass Du eigentlich einen &quot;Alias&quot; (abkürzende Bezeichnung für FaceMap[a.adjacentFaces[i&rsqb;&rsqb;) verwenden möchtest. Und genau dafür sind Referenzen ideal.<br />
Mit dem Pointer läufst Du Gefahr, ihn im Code versehentlich &quot;umzubiegen&quot; (auf ein Anderes Objekt oder 0) oder nicht zu wissen, ob Du irgendwas &quot;deleten&quot; musst oder nicht. Besonders über verschiedene Call-Ebenen hinweg wird das schnell zum Problem (z.B. musst Du dann eigentlich immer auf 0 überprüfen).<br />
Das alles sparst Du Dir halt mit einer Referenz.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1331274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331274</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 24 Jul 2007 07:40:09 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 07:54:16 GMT]]></title><description><![CDATA[<p>TLEP schrieb:</p>
<blockquote>
<p>Frage: Wenn man eine Referenz als Parameter einer Funktion implementiert, werden die Parameter noch auf den Stack gepusht? Würde ja eigentlich keinen Sinn machen.</p>
</blockquote>
<p>Das Problem ist doch: was pusht man auf den Stack? Das komplette Objekt? Dann hätte man plötzlich eine Kopie. Man muss also einen Verweis auf das Objekt pushen. Nur welche Möglichkeiten hat man dabei? Man muss eben einen Zeiger auf das Objekt pushen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1331283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331283</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 24 Jul 2007 07:54:16 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 08:20:02 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Edit: <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16570">@TLEP</a>: Aus C++ Sicht sind Referenzen &quot;nur&quot; ein Alias für eine andere Variable. Aber der Compiler muß das auch auf eine Art darstellen, die dein Rechner versteht - und wenn der keine eingebauten Referenzen hat, werden dafür hinter den Kulissen wieder Zeiger verwendet.</p>
</blockquote>
<p>Nicht unbedingt. In folgendem Code z.B. würde ich erwarten (ungetestet), dass der Compiler bitte *keinen* Zeiger anlegt:</p>
<pre><code class="language-cpp">{
    int a = 5;
    int&amp; ra = a;
    ra = 6;
}
</code></pre>
<p>Hier einen Zeiger anzulegen ist ein vollkommen unnützes Overhead,</p>
</blockquote>
<p>deswegen wird ein compiler keinen zeiger anlegen, genausowenig wie er das bei</p>
<pre><code class="language-cpp">{
    int a = 5;
    int* ra = &amp;a;
    *ra = 6;
}
</code></pre>
<p>machen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1331289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331289</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Tue, 24 Jul 2007 08:20:02 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;amp;Referenz und *Pointer on Tue, 24 Jul 2007 08:46:58 GMT]]></title><description><![CDATA[<p>Fangt bloß nicht wieder damit an, ob Referenzen speicher belegen oder nicht, dass hatten wir schon alles ausführlich hier <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> :<br />
<a href="http://c-plusplus.net/forum/viewtopic-var-p-is-1293753.html#1293753" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-p-is-1293753.html#1293753</a></p>
<p>&quot;Nicht spezifiziert&quot;, aber wir können davon ausgehen, dass die meißten Compiler es so machen: <a href="http://c-plusplus.net/forum/viewtopic-var-p-is-1330752.html#1330752" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-p-is-1330752.html#1330752</a> ( als Aliase bzw. zweiter Name )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1331307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1331307</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 24 Jul 2007 08:46:58 GMT</pubDate></item></channel></rss>