<?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[Effizienzfrage Variablenzuweisung]]></title><description><![CDATA[<p>Hallo.</p>
<p>was ist effizienter und warum?</p>
<p>Dies:</p>
<pre><code class="language-cpp">double timestamp = getTimeStamp();
</code></pre>
<p>oder das:</p>
<pre><code class="language-cpp">double timestamp(getTimeStamp());
</code></pre>
<p>Meiner Meinung nach sollte die 2te Variante günstiger sein, da das double Objekt direkt mit einem copy-Konstruktor initialisiert wird. Im ersten Fall wird das Objekt ja erst angelegt und dann zugewiesen. Ist das korrekt?</p>
<p>Wenn ja: Sollte dann nicht auch jede for-schleife so aussehen?<br />
for (int i(0); i &lt; Bedingung; ++i) ?</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/251659/effizienzfrage-variablenzuweisung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 10:08:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/251659.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 08 Oct 2009 12:12:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Effizienzfrage Variablenzuweisung on Thu, 08 Oct 2009 12:12:58 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>was ist effizienter und warum?</p>
<p>Dies:</p>
<pre><code class="language-cpp">double timestamp = getTimeStamp();
</code></pre>
<p>oder das:</p>
<pre><code class="language-cpp">double timestamp(getTimeStamp());
</code></pre>
<p>Meiner Meinung nach sollte die 2te Variante günstiger sein, da das double Objekt direkt mit einem copy-Konstruktor initialisiert wird. Im ersten Fall wird das Objekt ja erst angelegt und dann zugewiesen. Ist das korrekt?</p>
<p>Wenn ja: Sollte dann nicht auch jede for-schleife so aussehen?<br />
for (int i(0); i &lt; Bedingung; ++i) ?</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789631</guid><dc:creator><![CDATA[Erhard]]></dc:creator><pubDate>Thu, 08 Oct 2009 12:12:58 GMT</pubDate></item><item><title><![CDATA[Reply to Effizienzfrage Variablenzuweisung on Thu, 08 Oct 2009 12:18:25 GMT]]></title><description><![CDATA[<p>Erhard schrieb:</p>
<blockquote>
<p>Meiner Meinung nach sollte die 2te Variante günstiger sein, da das double Objekt direkt mit einem copy-Konstruktor initialisiert wird. Im ersten Fall wird das Objekt ja erst angelegt und dann zugewiesen. Ist das korrekt?</p>
</blockquote>
<p>Nein. Grundsätzlich wird das objekt sofort initialisiert. Allerdings hat die Schreibweise <code>T a = b</code> formal die Bedeutung, dass zuerst ein temporäres Objekt vom Typ T angelegt wird und dann a mit dem temporären Objekt copy-initlaisiert wird. In der Praxis optimieren so ziemlich alle Compiler das temporäre Objekt weg. AFAIK ists sogar bei PODs schon von vornherein ohne die Kopie festgelegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789638</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 08 Oct 2009 12:18:25 GMT</pubDate></item><item><title><![CDATA[Reply to Effizienzfrage Variablenzuweisung on Thu, 08 Oct 2009 13:00:20 GMT]]></title><description><![CDATA[<p>Probiere es aus! Schreibe eine Klasse mit default, init und copy constructor , sowie einen Zuweisungsoperator und schaue dir das Verhalten an.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Testy
{
    public:
        Testy() { std::cout &lt;&lt; &quot;default&quot; &lt;&lt; std::endl; }
        Testy( const Testy&amp; ) { std::cout &lt;&lt; &quot;copy&quot; &lt;&lt; std::endl; }
        Testy&amp; operator=( const Testy&amp; testy ) { std::cout &lt;&lt; &quot;assign&quot; &lt;&lt; std::endl; }
};

int main()
{
    Testy a;
    Testy b = a;
    Testy c;
    c = a;
    return 0;
}
</code></pre>
<p>Es hat auch nichts mit Compileroptimierung zu tun. &quot;Testy b = a&quot; hat die Semantik einer Kopierkonstruktion, auch wenn es nicht so aussieht. Zeile 14 ist eben nicht aequivalent zu Zeile 15+16.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789667</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 08 Oct 2009 13:00:20 GMT</pubDate></item><item><title><![CDATA[Reply to Effizienzfrage Variablenzuweisung on Thu, 08 Oct 2009 13:06:35 GMT]]></title><description><![CDATA[<p><a href="http://www.gotw.ca/gotw/036.htm" rel="nofollow">http://www.gotw.ca/gotw/036.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789677</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Thu, 08 Oct 2009 13:06:35 GMT</pubDate></item><item><title><![CDATA[Reply to Effizienzfrage Variablenzuweisung on Thu, 08 Oct 2009 13:52:25 GMT]]></title><description><![CDATA[<p>Erhard schrieb:</p>
<blockquote>
<p>Meiner Meinung nach sollte die 2te Variante günstiger sein, da das double Objekt direkt mit einem copy-Konstruktor initialisiert wird. Im ersten Fall wird das Objekt ja erst angelegt und dann zugewiesen. Ist das korrekt?</p>
</blockquote>
<p>Welche Meinung du dazu hast, spielt an sich keine Rolle, double ist keine Klasse und hat keinen copy-Konstruktor und eine Initialisierung ist keine Zuweisung. Dass der Speicher für ein Objekt zunächst reserviert werden muss, bevor in diesem reservierten Speicher ein Wert abgelegt werden kann, ist trivial und hat nichts mit der Schreibweise zu tun. Also: nein.</p>
<p>Meinungssache ist hingehen dies:</p>
<pre><code class="language-cpp">double timestamp = getTimeStamp(); // (1)
double timestamp(getTimeStamp()); // (2)
</code></pre>
<p>dass (2) bei weitem hässlicher und schwerer zu verstehen ist (im Sinne von Zeitaufwand, um mit den Augen alle Klammern auseinander zu nehmen). Das ist meine Meinung dazu.</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Grundsätzlich wird das objekt sofort initialisiert. Allerdings hat die Schreibweise <code>T a = b</code> formal die Bedeutung, dass zuerst ein temporäres Objekt vom Typ T angelegt wird und dann a mit dem temporären Objekt copy-initlaisiert wird.</p>
</blockquote>
<p>Das klingt widersprüchlich. Gibt es einen Unterschied zwischen formaler und tatsächlicher Bedeutung? Zudem ist der zweite Satz falsch weil zu allgemein gehalten (selbst wenn wir Referenzen und Arrays von vornherein ignorieren):<br />
Bei der Initialisierung <code>T a = b</code> kann ein temporäres Objekt dann und nur dann entstehen, wenn<br />
1. T eine Klasse ist <em>und</em><br />
2. der cv-unqualifizierte Typ von b <em>nicht</em> T oder eine von T abgeleitete Klasse ist,<br />
als Folge einer impliziten Konvertierung. Dieses temporäre Objekt kann gemäß 12.8/15 stets eliminiert werden, sofern es den Typ T hat - auf besondere Eigenschaften von T kommt es dabei nicht an. Sind obige Bedingungen nicht erfüllt, besteht, abgesehen vom Fall expliziter Copy-Konstruktoren, keinerlei Bedeutungsunterschied zwischen direkter und Copy-Initialisierung.</p>
<p>Ist T ein Skalar, so sind temporäre Objekte von vornherein nicht im Spiel.<br />
Skalare temporäre Objekte entstehen nur, wenn ein rvalue an eine const-Referenz gebunden wird, oder ein eine entsprechende Exception geworfen wird,</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789709</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 08 Oct 2009 13:52:25 GMT</pubDate></item><item><title><![CDATA[Reply to Effizienzfrage Variablenzuweisung on Thu, 08 Oct 2009 14:46:25 GMT]]></title><description><![CDATA[<p><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>
<p>camper schrieb:</p>
<blockquote>
<p>[...] als Folge einer impliziten Konvertierung. Dieses temporäre Objekt kann gemäß 12.8/15 stets eliminiert werden, sofern es den Typ T hat [...]</p>
</blockquote>
<p>Kannste mir grad mal ein Beispiel geben, wo dieses temporöre Objekt nicht vom Typ T ist?</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789740</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Thu, 08 Oct 2009 14:46:25 GMT</pubDate></item><item><title><![CDATA[Reply to Effizienzfrage Variablenzuweisung on Thu, 08 Oct 2009 15:37:49 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Kannste mir grad mal ein Beispiel geben, wo dieses temporöre Objekt nicht vom Typ T ist?</p>
</blockquote>
<p>Es kann auch ein abgeleiteter Typ sein:</p>
<pre><code class="language-cpp">struct foo {};
struct foo_derived : foo {};
struct bar { operator foo_derived() { return foo_derived(); } };

bar x;
foo y = x;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1789766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789766</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 08 Oct 2009 15:37:49 GMT</pubDate></item><item><title><![CDATA[Reply to Effizienzfrage Variablenzuweisung on Thu, 08 Oct 2009 18:41:56 GMT]]></title><description><![CDATA[<p>Besten Dank! War mir nicht bewusst, der Fall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789831</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Thu, 08 Oct 2009 18:41:56 GMT</pubDate></item></channel></rss>