<?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[Lambda: pass-by-value]]></title><description><![CDATA[<p>Hallo!</p>
<p>was ich mich oft frage, ist, wann es sinnvoll ist, Parameter von Lambdas als Wert oder Referenz zu übergeben. Beispiel: Verwendung von nem Lambda-Prädikat in <code>std::find_if</code> . Angenommen, ich möchte damit etwas in einem Container, welcher Structs mit ca. 5 bis 10 ints beinhaltet, suchen:</p>
<pre><code class="language-cpp">struct A
{
    int a, b, c, d, e, f, g;
}

// ...

vector&lt;A&gt; vec;

// ...

auto it = find_if(vec.begin(), vec.end(), [](A  element) { return element.c == 42; }); // 1
auto it = find_if(vec.begin(), vec.end(), [](A&amp; element) { return element.c == 42; }); // 2
</code></pre>
<p>Kann man sich auch für große <code>A</code> darauf verlassen, dass der Compiler bei Version 1 die Kopie wegoptimiert, oder sollte man doch lieber Version 2 benutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306049/lambda-pass-by-value</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 10:05:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306049.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Jul 2012 14:15:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lambda: pass-by-value on Mon, 16 Jul 2012 14:15:13 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>was ich mich oft frage, ist, wann es sinnvoll ist, Parameter von Lambdas als Wert oder Referenz zu übergeben. Beispiel: Verwendung von nem Lambda-Prädikat in <code>std::find_if</code> . Angenommen, ich möchte damit etwas in einem Container, welcher Structs mit ca. 5 bis 10 ints beinhaltet, suchen:</p>
<pre><code class="language-cpp">struct A
{
    int a, b, c, d, e, f, g;
}

// ...

vector&lt;A&gt; vec;

// ...

auto it = find_if(vec.begin(), vec.end(), [](A  element) { return element.c == 42; }); // 1
auto it = find_if(vec.begin(), vec.end(), [](A&amp; element) { return element.c == 42; }); // 2
</code></pre>
<p>Kann man sich auch für große <code>A</code> darauf verlassen, dass der Compiler bei Version 1 die Kopie wegoptimiert, oder sollte man doch lieber Version 2 benutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233208</guid><dc:creator><![CDATA[Bloops]]></dc:creator><pubDate>Mon, 16 Jul 2012 14:15:13 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda: pass-by-value on Mon, 16 Jul 2012 14:23:58 GMT]]></title><description><![CDATA[<p>Ich würd ne const-Referenz dranschreiben, dann hast du's quasi amtlich. Der Einheitlichkeit halber würde ich dir übrigens auch begin(vec), end(vec) als Schreibweise für den Bereich antragen, also</p>
<pre><code class="language-cpp">auto it = find_if(begin(vec), end(vec), [](A const &amp;element) { return element.c == 42; });
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2233213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233213</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 16 Jul 2012 14:23:58 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda: pass-by-value on Mon, 16 Jul 2012 14:28:59 GMT]]></title><description><![CDATA[<p>Bloops schrieb:</p>
<blockquote>
<p>Hallo!</p>
<p>was ich mich oft frage, ist, wann es sinnvoll ist, Parameter von Lambdas als Wert oder Referenz zu übergeben. Beispiel: Verwendung von nem Lambda-Prädikat in <code>std::find_if</code> . Angenommen, ich möchte damit etwas in einem Container, welcher Structs mit ca. 5 bis 10 ints beinhaltet, suchen:</p>
<pre><code class="language-cpp">struct A
{
    int a, b, c, d, e, f, g;
}

// ...

vector&lt;A&gt; vec;

// ...

auto it = find_if(vec.begin(), vec.end(), [](A  element) { return element.c == 42; }); // 1
auto it = find_if(vec.begin(), vec.end(), [](A&amp; element) { return element.c == 42; }); // 2
</code></pre>
<p>Kann man sich auch für große <code>A</code> darauf verlassen, dass der Compiler bei Version 1 die Kopie wegoptimiert, oder sollte man doch lieber Version 2 benutzen?</p>
</blockquote>
<p>Bei solchen einfachen Prädikaten dürfte eine (const-)Referenz-Übergabe im allgemeinen die richtige Wahl sein (im Falle von primitiven Datentypen dürfte es egal sein). Da das übergebene Argument (nahezu) stets ein lvalue ist (=derefenzierter Iterator), kommt es nicht zu einer unnötigen zusätzlichen Indirektion.<br />
Die Eliminierung der Kopie im ersten Fall hingegen basiert auf unveränderten beobachtbaren Verhalten (as-if), setzt also entsprechende Einstellungen voraus, und ist ohne Inlining kaum durchführbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233215</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 16 Jul 2012 14:28:59 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda: pass-by-value on Tue, 17 Jul 2012 16:25:02 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Antworten!</p>
<p>camper schrieb:</p>
<blockquote>
<p>Da das übergebene Argument (nahezu) stets ein lvalue ist (=derefenzierter Iterator), kommt es nicht zu einer unnötigen zusätzlichen Indirektion.</p>
</blockquote>
<p>Klingt plausibel, daran hab ich gar nicht gedacht.</p>
<p>camper schrieb:</p>
<blockquote>
<p>Die Eliminierung der Kopie im ersten Fall hingegen basiert auf unveränderten beobachtbaren Verhalten (as-if), setzt also entsprechende Einstellungen voraus, und ist ohne Inlining kaum durchführbar.</p>
</blockquote>
<p>Hmmm... Sind Lambdas nicht automatisch geinlined? Falls nein, wie stellt man das an?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233556</guid><dc:creator><![CDATA[Bloops]]></dc:creator><pubDate>Tue, 17 Jul 2012 16:25:02 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda: pass-by-value on Tue, 17 Jul 2012 16:55:31 GMT]]></title><description><![CDATA[<p>Bloops schrieb:</p>
<blockquote>
<p>Hmmm... Sind Lambdas nicht automatisch geinlined? Falls nein, wie stellt man das an?</p>
</blockquote>
<p>Das wird durch den Standard nicht festgelegt, beobachtbar ist das sowieso nicht.<br />
Der generierte operator() des closure-Typs ist eine inline Funktion, das ist aber nur eine Aussage in Hinblick auf die ODR.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233571</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 17 Jul 2012 16:55:31 GMT</pubDate></item></channel></rss>