<?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[Zeiger als Parameter immer besser als vector?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine ganz grundsätzliche Frage:</p>
<p>Ist es immer besser einer Funktion einen Zeiger auf einen vector zu übergeben, anstatt den vector selbst?</p>
<p>Also</p>
<pre><code class="language-cpp">void foo(vector&lt;int&gt; *vec)
</code></pre>
<p>ist doch eigentlich immer besser (von der Geschwindigkeit her) als</p>
<pre><code class="language-cpp">void foo(vector&lt;int&gt; vec)
</code></pre>
<p>oder?</p>
<p>Danke,<br />
Albert</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/297852/zeiger-als-parameter-immer-besser-als-vector</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 23:33:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297852.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 08 Jan 2012 14:01:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Sun, 08 Jan 2012 14:01:56 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine ganz grundsätzliche Frage:</p>
<p>Ist es immer besser einer Funktion einen Zeiger auf einen vector zu übergeben, anstatt den vector selbst?</p>
<p>Also</p>
<pre><code class="language-cpp">void foo(vector&lt;int&gt; *vec)
</code></pre>
<p>ist doch eigentlich immer besser (von der Geschwindigkeit her) als</p>
<pre><code class="language-cpp">void foo(vector&lt;int&gt; vec)
</code></pre>
<p>oder?</p>
<p>Danke,<br />
Albert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165308</guid><dc:creator><![CDATA[Albert12]]></dc:creator><pubDate>Sun, 08 Jan 2012 14:01:56 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Sun, 08 Jan 2012 14:35:08 GMT]]></title><description><![CDATA[<p>Das ist C++ und kein CLI. CLI ist praktisch eine ganz andere Sprache basierend auf dem .NET Framework, wird nur von Microsoft immer als Erweiterung von C++ verkauft. <a href="http://www.c-plusplus.net/forum/263084" rel="nofollow">http://www.c-plusplus.net/forum/263084</a></p>
<p>Zu deiner Frage aber gibt es schon ein Thema: <a href="http://www.c-plusplus.net/forum/258490-full" rel="nofollow">http://www.c-plusplus.net/forum/258490-full</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165336</guid><dc:creator><![CDATA[Taeli]]></dc:creator><pubDate>Sun, 08 Jan 2012 14:35:08 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Mon, 09 Jan 2012 12:58:36 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/u18363" rel="nofollow">Jochen Kalmbach</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/f58" rel="nofollow">C++/CLI mit .NET</a> in das Forum <a href="http://www.c-plusplus.net/forum/f15" rel="nofollow">C++ (auch C++0x, bzw. C++11)</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165758</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Mon, 09 Jan 2012 12:58:36 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Mon, 09 Jan 2012 13:18:49 GMT]]></title><description><![CDATA[<p>Das kommt immer auf den Einzelfall an. In deinem zweiten Beispiel wird eine komplette Kopie des Vektors erzeugt. Es gibt Situationen, in denen das wünschenswert ist.<br />
Wenn keine Kopie gebraucht wird, und auch die Übergabe eines NULL-Pointers nicht erwogen wird würde ich eine Referenz übergeben.</p>
<pre><code class="language-cpp">void foo(vector&lt;int&gt; &amp;vec)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2165769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165769</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Mon, 09 Jan 2012 13:18:49 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Mon, 09 Jan 2012 14:03:03 GMT]]></title><description><![CDATA[<p>Albert12 schrieb:</p>
<blockquote>
<p>,<br />
ich habe eine ganz grundsätzliche Frage:</p>
<p>Ist es immer besser einer Funktion einen Zeiger auf einen vector zu übergeben, anstatt den vector selbst?</p>
</blockquote>
<p>Nein. Es gibt sicher genug Fälle, wo es andersherum mehr Sinn macht.</p>
<p>Albert12 schrieb:</p>
<blockquote>
<p>Also</p>
<pre><code class="language-cpp">void foo(vector&lt;int&gt; *vec)
</code></pre>
<p>ist doch eigentlich immer besser (von der Geschwindigkeit her) als</p>
<pre><code class="language-cpp">void foo(vector&lt;int&gt; vec)
</code></pre>
<p>oder?</p>
</blockquote>
<p>Schneller, ja. Aber es ist auch etwas völlig anderes. Die erste Funktion kann den Vektor des Aufrufers verändern. Die zweite Funktion hat ihre eigene Kopie des Vektors und Änderungen an dieser Kopie sind ohne weiteres nicht sichtbar nach außen.</p>
<p>Eine dritte Variante wäre:</p>
<pre><code class="language-cpp">void foo(vector&lt;int&gt; const&amp; vec)
</code></pre>
<p>Hier wird der Funktion nur eine Referenz übergeben, was so etwas ähnliches ist wie ein Zeiger. Allerdings kann und darf die Funktion das referenzierte Objekt wegen des &quot;const&quot;s nicht verändern (zumindest nicht über diese Referenz ohne const_cast). Man spart sich beim Aufruf den Adressoperator und die teure Kopie des Vektors.</p>
<p>Was Du verwenden solltest, hängt wirklich davon ab, was Du eigentlich machen willst. Gerade seit C++2011 macht es in einigen Fällen mehr Sinn, auch wieder pass-by-value und return-by-value zuzulassen, da viele Typen extrem schnell &quot;move-bar&quot; sind (an einen neuen Speicherort schnell umziehen können); denn nicht immer ist eine Kopie von nöten. Beispiel:</p>
<p>C++11:</p>
<pre><code class="language-cpp">vector&lt;int&gt; umdrehen(vector&lt;int&gt; v) {
  reverse(v.begin(),v.end());
  return v;
}

int main() {
  vector&lt;int&gt; x = {1,2,3,5,8,13};
  x = umdrehen(move(x));
}
</code></pre>
<p>Hier wird <em>nirgendswo</em> etwas unnötig kopiert. Der Vektor zieht in den Scope der Funktion um, wird dort verändert und zieht dann quasi wieder zurück. So erlaubt C++2011 einen etwas funktionaleren Stil, ohne dass man sich mit Zeigern und Referenzen die Hände dreckig machen muss und ohne hohe Kosten bzgl Performanz.</p>
<p>Anderes Beispiel:</p>
<pre><code class="language-cpp">class person {
  string name_;
  int geburtsjahr_;
public:
  person(string n, int gj) 
  : name_(move(n))
  , geburtsjahr_(gj)
  {}
};
</code></pre>
<p>Das 'n' wird ggf durch eine Kopie erzeugt. Da ein person-Objekt aber einen eigenen string speichert, muss irgendwo sowieso etwas kopiert werden. Das kann man hier dem Compiler bei der Erzeugunn von 'n' überlassen. Später zieht der String eben nach name_ um.</p>
<p>Früher hätte man den Konstruktor wahrscheinlich so geschrieben:</p>
<pre><code class="language-cpp">person(string const&amp; n, int gj) 
  : name_(n)
  , geburtsjahr_(gj)
  {}
</code></pre>
<p>Gut. Viel schlechter ist das jetzt auch nicht. Aber in einigen Fällen führt das noch zu einer unnötigen Kopie; denn hier wird <em>explizit</em> kopiert, da der Kopierkonstruktor direkt vom Programmierer aufgerufen wird. Das wäre aber gar nicht nötig in jeden Fall, z.b. wenn das Argument des Konstruktors nur ein temporärer String ist, der auch einfach &quot;umziehen&quot; könnte.</p>
<p>Grundsätzlich: Soll die Funktion das übergebene Objekt nicht ändern und/oder nicht woanders hinkopieren, dann ist die Übergabe per ref-auf-const immer noch sinnvoll. Andernfalls ist ggf die Übergabe per value sinnvoll. Das kommt auch dann drauf an, ob der entsprechende Typ move-optimiert ist oder nicht.</p>
<p>In generischem Code weiß man das nicht immer, ob ein Typ move-optimiert ist oder nicht. Da kann man dann in solchen Fällen z.B. mit &quot;perfect forwarding&quot; arbeiten:</p>
<pre><code class="language-cpp">#define REQUIRES(...) ,class=typename std::enable_if&lt;(__VA_ARGS__)&gt;::type

template&lt;class A, class B&gt;
struct my_pair {
  A first;
  B second;

  my_pair() = default;

  template&lt;class T, class U
    REQUIRES(   is_convertible&lt;T,A&gt;::value
             &amp;&amp; is_convertible&lt;U,B&gt;::value)
  &gt;
  my_pair(T&amp;&amp; t, U&amp;&amp; u)
  : first(forward&lt;T&gt;(t))
  , second(forward&lt;U&gt;(u))
  {}
};
</code></pre>
<p>Was auch immer t und u sind, solange ich damit ein A bzw ein B erzeugen kann, wird das Argument direkt weitergeleitet.</p>
<p>Cheers!<br />
kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165782</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 09 Jan 2012 14:03:03 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Mon, 09 Jan 2012 13:54:42 GMT]]></title><description><![CDATA[<p>Albert12 schrieb:</p>
<blockquote>
<p>Ist es immer besser einer Funktion einen Zeiger auf einen vector zu übergeben, anstatt den vector selbst?</p>
</blockquote>
<p>Kommt drauf an. Es gibt zwei Fälle:<br />
- Die Funktion kopiert das Objekt sowieso -&gt; Wertübergabe <code>void foo(vector&lt;int&gt; vec)</code><br />
- Die Funktion kopiert das Objekt nicht (verwendet es nur vorübergehend oder speichert die Adresse des Objektes) -&gt; Referenzübergabe <code>void foo(const vector&lt;int&gt; &amp;vec)</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165791</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Mon, 09 Jan 2012 13:54:42 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Fri, 13 Jan 2012 13:03:04 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>....</p>
<p>C++11:</p>
<pre><code class="language-cpp">vector&lt;int&gt; umdrehen(vector&lt;int&gt; v) {
  reverse(v.begin(),v.end());
  return v;
}

int main() {
  vector&lt;int&gt; x = {1,2,3,5,8,13};
  x = umdrehen(move(x));
}
</code></pre>
<p>Hier wird <em>nirgendswo</em> etwas unnötig kopiert. Der Vektor zieht in den Scope der Funktion um, wird dort verändert und zieht dann quasi wieder zurück. So erlaubt C++2011 einen etwas funktionaleren Stil, ohne dass man sich mit Zeigern und Referenzen die Hände dreckig machen muss und ohne hohe Kosten bzgl Performanz.<br />
...<br />
kk</p>
</blockquote>
<p>Ok super, jetzt hab ichs glaub grob verstanden. Ich wollte garnicht darauf raus, dass eine Kopie verändert werden kann und bei einem Zeiger oder einer Referenz die Variable außerhalb auch geändert wird.</p>
<p>Bei dem C++11 Beispiel erkennt der Compiler also automatisch, ob der übergebene Vektor sich selbst wieder zugewiesen bekommt?!<br />
Bei vorhergehenden Versionen hätte er hier also eine Kopie auf den Stack gelegt und eine Kopie zurückgegeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2167624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2167624</guid><dc:creator><![CDATA[Albert12]]></dc:creator><pubDate>Fri, 13 Jan 2012 13:03:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Fri, 13 Jan 2012 18:57:42 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p><a href="http://ideone.com/WYEql" rel="nofollow">http://ideone.com/WYEql</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2167759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2167759</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 13 Jan 2012 18:57:42 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Fri, 13 Jan 2012 19:14:34 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p><a href="http://ideone.com/WYEql" rel="nofollow">http://ideone.com/WYEql</a></p>
</blockquote>
<p>Möchtest du uns etwas mitteilen?</p>
<blockquote>
<p>language: C++0x <strong>(gcc-4.5.1)</strong></p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2167762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2167762</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 13 Jan 2012 19:14:34 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Fri, 13 Jan 2012 19:15:48 GMT]]></title><description><![CDATA[<p>Wie kommst du nur darauf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2167765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2167765</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 13 Jan 2012 19:15:48 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Fri, 13 Jan 2012 19:22:56 GMT]]></title><description><![CDATA[<p>Alles, was ich da sehe, ist, dass der GCC 4.5.1 nicht C++11-konform ist.<br />
Gibt's da sonst noch was zu sehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2167766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2167766</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 13 Jan 2012 19:22:56 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Fri, 13 Jan 2012 19:29:41 GMT]]></title><description><![CDATA[<p>Hi,<br />
auch heute wieder, gibt es Senf <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>Bei der Übergabe von Strukturen und Klassen, oder besser Objekten,<br />
ist es immer besser eine (konstante) Referenz zu nehmen.</p>
<p>Wenn man einen Zeiger nimmt, muss man zuviel mit dem * Arbeiten.<br />
Wenn man eine Kopie des Objektes erzeugt, wird erst der CopyCTor aufgerufen und<br />
am ende der Funktion wieder der entsprechende DTor. Wenn jetzt der Vector<br />
auch noch als Elementtyp ein Objekt hat kann es je nach implementation<br />
quasi eeewig dauern bis Du vollständig deine Funktion betreten hast.</p>
<p>Seid gegrüßt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2167768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2167768</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Fri, 13 Jan 2012 19:29:41 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Fri, 13 Jan 2012 19:31:20 GMT]]></title><description><![CDATA[<p>Albert12 schrieb:</p>
<blockquote>
<p>Bei dem C++11 Beispiel erkennt der Compiler also automatisch, ob der übergebene Vektor sich selbst wieder zugewiesen bekommt?!</p>
</blockquote>
<p>Ob er das &quot;erkennt&quot; oder nicht, spielt gar keine Rolle. Die Funktion liefert einen namenlosen Vektor zurück und der entsprechende Zuweisungsoperator nutzt dies aus und klaut dem temporären Vektor quasi seine Eingeweide.</p>
<p>Albert12 schrieb:</p>
<blockquote>
<p>Bei vorhergehenden Versionen hätte er hier also eine Kopie auf den Stack gelegt und eine Kopie zurückgegeben?</p>
</blockquote>
<p>Das passiert immer noch. Aus der überflüssigen Kopie wird nur ein „Move“.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2167769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2167769</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 13 Jan 2012 19:31:20 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Fri, 13 Jan 2012 21:52:43 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Alles, was ich da sehe, ist, dass der GCC 4.5.1 nicht C++11-konform ist.<br />
Gibt's da sonst noch was zu sehen?</p>
</blockquote>
<p>Letztes mal hat man mir gesagt, bei Argumenten ist das nicht erlaubt. Dieses mal sagt man mir der GCC wäre nicht standardkonform.<br />
Verarschen kann ich mich selbst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2167808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2167808</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 13 Jan 2012 21:52:43 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Fri, 13 Jan 2012 22:30:22 GMT]]></title><description><![CDATA[<p>Wahrscheinlich verwechselst du das gerade mit NRVO, was – soweit ich weiß – in dem Fall nicht mehr erlaubt ist. Nicht, dass das schlimm wäre; denn das hat ja eh kein Compiler „geschafft“.</p>
<p>Der GCC 4.6.1 macht das jedenfalls richtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2167819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2167819</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 13 Jan 2012 22:30:22 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter immer besser als vector? on Fri, 13 Jan 2012 23:15:42 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Wahrscheinlich verwechselst du das gerade mit NRVO, was – soweit ich weiß – in dem Fall nicht mehr erlaubt ist. Nicht, dass das schlimm wäre; denn das hat ja eh kein Compiler „geschafft“.</p>
<p>Der GCC 4.6.1 macht das jedenfalls richtig.</p>
</blockquote>
<p>Danke für die Erläuterung, krümelkacker... <em>jetzt</em> ist mir klar, was pi meinte.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22268">@pi</a>: Ein Link auf ideone stellt kein Argument dar; das musst du schon noch dazu formulieren, wenn du verstanden werden willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2167835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2167835</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 13 Jan 2012 23:15:42 GMT</pubDate></item></channel></rss>