<?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[Vector richtig moven]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>ich habe folgenden Codeauschnitt:</p>
<pre><code>typedef std::vector&lt;unsigned char&gt; byte_buffer;

class split {

private:
	util::uid m_fuid;
	byte_buffer m_data;
	byte_buffer m_iv;
	byte_buffer_sec m_pw;

};
//-------------
generator::process() {
//....
	byte_buffer splitData( queue.MaxRetrievable(), 0);
	util::queueSource src( queue, true, new CryptoPP::ArraySink( splitData.data(), splitData.size()) );

	return split( fuid, splitData , m_iv, plainDigest);
}
//-------------

api::split::split split( gen.process() );
</code></pre>
<p>Die Frage dazu ist wie ich es jetzt schaffe damit der Vector beim split Ctor nicht kopiert wird.<br />
Und der split selber sollte auch nicht kopiert werden.</p>
<p>Das Problem bei splitDatadas ist, das die groesse zwischen 1 - 50 MB sein kann.</p>
<p>Ich bentutze VS2010 falls das wichtig ist wegen C++11 features.</p>
<p>Gruessle stuxn</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/314803/vector-richtig-moven</link><generator>RSS for Node</generator><lastBuildDate>Fri, 31 Jul 2026 22:29:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/314803.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Mar 2013 13:00:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vector richtig moven on Thu, 14 Mar 2013 13:00:01 GMT]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>ich habe folgenden Codeauschnitt:</p>
<pre><code>typedef std::vector&lt;unsigned char&gt; byte_buffer;

class split {

private:
	util::uid m_fuid;
	byte_buffer m_data;
	byte_buffer m_iv;
	byte_buffer_sec m_pw;

};
//-------------
generator::process() {
//....
	byte_buffer splitData( queue.MaxRetrievable(), 0);
	util::queueSource src( queue, true, new CryptoPP::ArraySink( splitData.data(), splitData.size()) );

	return split( fuid, splitData , m_iv, plainDigest);
}
//-------------

api::split::split split( gen.process() );
</code></pre>
<p>Die Frage dazu ist wie ich es jetzt schaffe damit der Vector beim split Ctor nicht kopiert wird.<br />
Und der split selber sollte auch nicht kopiert werden.</p>
<p>Das Problem bei splitDatadas ist, das die groesse zwischen 1 - 50 MB sein kann.</p>
<p>Ich bentutze VS2010 falls das wichtig ist wegen C++11 features.</p>
<p>Gruessle stuxn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306647</guid><dc:creator><![CDATA[stuxn]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:00:01 GMT</pubDate></item><item><title><![CDATA[Reply to Vector richtig moven on Thu, 14 Mar 2013 13:09:20 GMT]]></title><description><![CDATA[<p>Ich meine das wird wegoptimiert, Stickwort Copy-Elision und Return Value Optimization.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306652</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:09:20 GMT</pubDate></item><item><title><![CDATA[Reply to Vector richtig moven on Thu, 14 Mar 2013 13:14:26 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Ich meine das wird wegoptimiert, Stickwort Copy-Elision und Return Value Optimization.</p>
</blockquote>
<p>Hmm also bei split irgendwie nicht. Wenn ich den Copy-Ctor im private Bereich erstelle kann ichs nicht mehr Kompilieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306658</guid><dc:creator><![CDATA[stuxn]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:14:26 GMT</pubDate></item><item><title><![CDATA[Reply to Vector richtig moven on Thu, 14 Mar 2013 13:20:49 GMT]]></title><description><![CDATA[<p>Regel Nummer 1: Optimierungen anschalten, sonst macht der Compiler je nachdem gar nix.</p>
<p>Ja, verbieten darfst du die Kopien auch nicht. Denn dann lässt du eine Kopie ja nicht zu. Aber du willst das kopieren in manchen Fällen ja &quot;nur&quot; verschnellern.</p>
<p>Es ist nur so, dass bei einem temporären Returnwert, das Ergebnis (also das temporäre Objekt) ja nichtmehr gebraucht wird (in der Funktion/Methode), daher kann man dieses auch direkt in das Zielobjekt schieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306663</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:20:49 GMT</pubDate></item><item><title><![CDATA[Reply to Vector richtig moven on Thu, 14 Mar 2013 13:43:01 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Ich meine das wird wegoptimiert, Stickwort Copy-Elision und Return Value Optimization.</p>
</blockquote>
<p>Wie sollte dann der Ctor von split sein damit der vector nicht kopiert wird.</p>
<pre><code>split(const byte_buffer&amp; buf) : m_data(buf) {}
</code></pre>
<p>so?<br />
Und dann wuerde unter umstaenden der vector gemoved werden (mit optimierung an usw).</p>
<p>Oder koennte ich den mit:</p>
<pre><code>split(byte_buffer&amp;&amp; buf) : m_data(buf) {};

byte_buffer data(1024,0);
return split( std::move( data) );
</code></pre>
<p>dazu zwingen?</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Regel Nummer 1: Optimierungen anschalten, sonst macht der Compiler je nachdem gar nix.</p>
<p>Ja, verbieten darfst du die Kopien auch nicht. Denn dann lässt du eine Kopie ja nicht zu. Aber du willst das kopieren in manchen Fällen ja &quot;nur&quot; verschnellern.</p>
<p>Es ist nur so, dass bei einem temporären Returnwert, das Ergebnis (also das temporäre Objekt) ja nichtmehr gebraucht wird (in der Funktion/Methode), daher kann man dieses auch direkt in das Zielobjekt schieben.</p>
</blockquote>
<p>Ok macht Sinn ja. Haette aber schon gedacht das zumindestens sowas wie Return Value Optimization auch in der Debug Version mit dabei ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306687</guid><dc:creator><![CDATA[stuxn]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:43:01 GMT</pubDate></item><item><title><![CDATA[Reply to Vector richtig moven on Thu, 14 Mar 2013 13:46:44 GMT]]></title><description><![CDATA[<p>Ja, zur Not halt selbst einen Move Construktor schreiben.</p>
<p>Und wenn du schonmal mit dem Debugger durch die Release Version eines Programms gegangen bist, dann weiste ja wie das aussieht und was da alles wegfällt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306690</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:46:44 GMT</pubDate></item><item><title><![CDATA[Reply to Vector richtig moven on Thu, 14 Mar 2013 14:09:56 GMT]]></title><description><![CDATA[<p>Hmm ok also so sieht mein jetziger Versuch aus:</p>
<pre><code>split(const util::uid&amp; uid,byte_buffer&amp;&amp; data,const byte_buffer&amp; iv,  const byte_buffer_sec&amp; pw) :
	  	m_fuid( uid), m_data( data), m_iv(iv), m_pw(pw)
	{
	}
//---------------
split func() {
	byte_buffer splitData( queue.MaxRetrievable(), 0);
	util::queueSource src( queue, true, new CryptoPP::ArraySink( splitData.data(), splitData.size()) );

	return split( fuid, std::move(splitData) , m_iv, plainDigest);
}
</code></pre>
<p>Beim Aufruf der letzten Zeile, wird trotzdem der Copy-Ctor von Vector aufgerufen. Das sollte doch eingentlich nicht sein oder.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306700</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306700</guid><dc:creator><![CDATA[stuxn]]></dc:creator><pubDate>Thu, 14 Mar 2013 14:09:56 GMT</pubDate></item><item><title><![CDATA[Reply to Vector richtig moven on Fri, 15 Mar 2013 19:43:45 GMT]]></title><description><![CDATA[<p>Hey Leute,<br />
ich wollte nochmal kurz fragen ob zufaellig einer eine Loesung fuer mein Problem haet.</p>
<p>Nochmal kurz beschrieben. Ich habe folgenden Code:</p>
<pre><code>class split {

public:

	split(const util::uid&amp; uid,byte_buffer&amp;&amp; data,const byte_buffer&amp; iv,  const byte_buffer_sec&amp; key) :
	  	m_fuid( uid), m_data( data), m_iv(iv), m_key(key)
	{
	}
	split(split&amp;&amp; rhs) :
		m_fuid( rhs.m_fuid), m_data( std::move(rhs.m_data) ), m_iv(rhs.m_iv), m_key(rhs.m_key)
	{
		std::cout &lt;&lt; &quot;move copy\n&quot;;
	}
	const util::uid&amp; fuid() const { return m_fuid; };
	const byte_buffer&amp; data() const { return m_data; };
	const byte_buffer&amp; iv() const { return m_iv; };
	const byte_buffer_sec&amp; key() const { return m_key; };

	tstring serialize(const byte_buffer ) const;
private:
	split(const split&amp; rhs);
	util::uid m_fuid;
	byte_buffer m_data;
	byte_buffer m_iv;
	byte_buffer_sec m_key;
};

//-----------
split func() {
//.......
	encryptQueue( queue, plainDigest); // hier wird buffer per aes256 verchluesselt
	util::uid fuid = generateUid( queue );

	byte_buffer splitData( queue.MaxRetrievable(), 0);
	util::queueSource src( queue, true, new CryptoPP::ArraySink( splitData.data(), splitData.size()) );

	return split( fuid, std::move(splitData) , m_iv, plainDigest);
	//return split();
}
</code></pre>
<p>Nun wird in meinem Test der Buffer( zwischen 1 - 50Mb) mit gzip compressed &amp; mit aes256 encrypted. Danach wir der Split zurueck gegeben und wieder decrypted, decompressed und auf die Platte geschrieben.</p>
<p>Das Problem ist aber das laut dem VS2010 Profiler ca 69% der Zeit dem Aufruf von</p>
<pre><code>return split( fuid, std::move(splitData) , m_iv, plainDigest);
</code></pre>
<p>zuzurechnen ist.<br />
Und per Debugging wird ersichtlich das der Vector nicht gemoved sonder per Copy-Ctor erstellt wird im Split-Ctor.</p>
<p>Was mache ich falsch?</p>
<p>Mit freundlichen Gruessen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307016</guid><dc:creator><![CDATA[stuxn]]></dc:creator><pubDate>Fri, 15 Mar 2013 19:43:45 GMT</pubDate></item><item><title><![CDATA[Reply to Vector richtig moven on Fri, 15 Mar 2013 20:50:23 GMT]]></title><description><![CDATA[<p>Also, Fragen bzgl C++11 Features beantworte ich eigentlich gerne (wenn ich das denn kann). Aber ich muss gestehen, dass dieser Thread hier etwas abschreckend ist. Erst wusste ich nicht so, wo das Problem ist, bzw welche Kopie du vermeiden willst und dann gibts hier so viel Code, den man noch stark hätte vereinfachen können...</p>
<p>Aber bei nochmaligen drübergucken ist mir das hier aufgefallen:</p>
<p>stuxn schrieb:</p>
<blockquote>
<pre><code>class split {
public:
	split(const util::uid&amp; uid,byte_buffer&amp;&amp; data,const byte_buffer&amp; iv,  const byte_buffer_sec&amp; key) :
	  	m_fuid( uid), m_data( data), m_iv(iv), m_key(key)
	{
	}
</code></pre>
</blockquote>
<p>das m_data(data) müsste m_data(std::move(data)) heißen; denn data ist eine <em>benannte</em> Rvalue-Referenz und damit ein Lvalue-Ausdruck. Klingt widersprüchlich, ist aber doch logisch, weil Lvalues ja gerade die Dinger sind, die &quot;einen Namen haben&quot;. Du kannst dich mit dem Namen &quot;data&quot; mehrfach auf ein und dasselbe Objekt beziehen. Das wär eine schlechte Idee, wenn es jedes Mal als Rvalue behandelt würde, weil der Zustand durch andere Move-Operationen klammheimlich sich verflüchtigen könnte, ohne dass man das will. Deswegen brauchst du hier ein explizites move.</p>
<p>Allerdings würde ich es eher so wie hier machen:</p>
<pre><code class="language-cpp">struct foo
{
  vector&lt;int&gt; v;

  explicit foo(vector&lt;int&gt; temp) // pass by value ist absicht. soll sich doch
  : v(move(temp))                // der compiler drum kümmern, wie das ding
  {}                             // zustande kommt. der move nach v ist ja
};                               // quasi kostenlos (gegenüber der kopie).

foo bar()
{
  vector&lt;int&gt; v;
  ...
  return foo(move(v));
}
</code></pre>
<p>Der Unterschied ist, dass hier der Konstruktor auch mit einem Lvalue aufrufbar ist, wobei in dem Fall der Vektor kopiert würde. Du hast also mit einem Konstruktor mit pass-by-value Parameter beide Fälle erschlagen.</p>
<p>Laut C++11 Regeln bekommt foo vom Compiler generierte Kopier- und Move-Operationen, die elementweise kopieren und moven. Falls Dein Compiler noch keine Move-Operationen für eine Klasse selbt generieren kann und auch die =default;-Syntax noch nicht beherrscht, musst du die leider selbst schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307029</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 15 Mar 2013 20:50:23 GMT</pubDate></item><item><title><![CDATA[Reply to Vector richtig moven on Fri, 15 Mar 2013 23:15:51 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Also, Fragen bzgl C++11 Features beantworte ich eigentlich gerne (wenn ich das denn kann). Aber ich muss gestehen, dass dieser Thread hier etwas abschreckend ist. Erst wusste ich nicht so, wo das Problem ist, bzw welche Kopie du vermeiden willst und dann gibts hier so viel Code, den man noch stark hätte vereinfachen können...</p>
</blockquote>
<p>Ja stimmt haette man in ein verstaendliches Beispiel packen koennen. Tut mir leid ich versprech Besserung.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>...<br />
Der Unterschied ist, dass hier der Konstruktor auch mit einem Lvalue aufrufbar ist, wobei in dem Fall der Vektor kopiert würde. Du hast also mit einem Konstruktor mit pass-by-value Parameter beide Fälle erschlagen.</p>
<p>Laut C++11 Regeln bekommt foo vom Compiler generierte Kopier- und Move-Operationen, die elementweise kopieren und moven. Falls Dein Compiler noch keine Move-Operationen für eine Klasse selbt generieren kann und auch die =default;-Syntax noch nicht beherrscht, musst du die leider selbst schreiben.</p>
</blockquote>
<p>Super danke hat wunderbar funktioniert. Muss unbedingt nochmal ueber das ganze RValue Theme drueberschaun. Bin da noch nicht 100% drin.<br />
Aber hoert sich auf jeden Fall logisch an.</p>
<p>Das =default kannt ich noch gar ned. Aber leider unterstuetzt das VS2010 nicht :(.</p>
<p>Jetzt sagt mein Profiler auch das das compressen die Zeit verbraet.</p>
<p>Vielen dank und gute Nacht.<br />
stuxn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307056</guid><dc:creator><![CDATA[stuxn]]></dc:creator><pubDate>Fri, 15 Mar 2013 23:15:51 GMT</pubDate></item><item><title><![CDATA[Reply to Vector richtig moven on Sat, 16 Mar 2013 08:44:05 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Regel Nummer 1: Optimierungen anschalten, sonst macht der Compiler je nachdem gar nix.</p>
<p>Ja, verbieten darfst du die Kopien auch nicht. Denn dann lässt du eine Kopie ja nicht zu. Aber du willst das kopieren in manchen Fällen ja &quot;nur&quot; verschnellern.</p>
<p>Es ist nur so, dass bei einem temporären Returnwert, das Ergebnis (also das temporäre Objekt) ja nichtmehr gebraucht wird (in der Funktion/Methode), daher kann man dieses auch direkt in das Zielobjekt schieben.</p>
</blockquote>
<p>Optimierungen verändern doch nicht die Semantik ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307090</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sat, 16 Mar 2013 08:44:05 GMT</pubDate></item><item><title><![CDATA[Reply to Vector richtig moven on Sat, 16 Mar 2013 11:18:33 GMT]]></title><description><![CDATA[<p>Die Copy-Elision-Optimierungen halten sich jedenfalls nicht an die as-if-Regel. Der Standard erlaubt explizit diese Optimierungen, welche beobachtbares Verhalten ändern können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307124</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 16 Mar 2013 11:18:33 GMT</pubDate></item><item><title><![CDATA[Reply to Vector richtig moven on Sat, 16 Mar 2013 19:43:04 GMT]]></title><description><![CDATA[<p>stuxn schrieb:</p>
<blockquote>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Ich meine das wird wegoptimiert, Stickwort Copy-Elision und Return Value Optimization.</p>
</blockquote>
<p>Hmm also bei split irgendwie nicht. Wenn ich den Copy-Ctor im private Bereich erstelle kann ichs nicht mehr Kompilieren.</p>
</blockquote>
<p>Es steht schwarz auf weiss im Standard, dass der Compiler in den Fällen wo er eine Kopie &quot;weglassen&quot; darf, trotzdem prüfen muss, ob es einen Copy-Ctor gibt der an der Stelle verwendet werden könnte und dürfte.</p>
<p>Es ist also per Definition nicht möglich durch private machen des Copy-Ctor zu prüfen ob der Compiler copy-elision macht.</p>
<p>Der Sinn dahinter ist, dass es anders furchtbar verwirrend wäre. Dann würde es nämlich drauf ankommen wie schlau der Compiler ist, ob du einen bestimmten Code compilieren kannst oder nicht. Und eine kleine Änderung die mit der kopierten Klasse gar nichts zu tun hat, könnte dazu führen dass es auf einmal nicht mehr geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2307246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2307246</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 16 Mar 2013 19:43:04 GMT</pubDate></item></channel></rss>