<?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;quot;movable&amp;quot; STL buffer?]]></title><description><![CDATA[<p>Hallo,</p>
<p>in meinen Klassen mit Pointern als Member scheint es zwei Arten von Pointern zu geben:</p>
<ul>
<li>(a) Pointer, die auf eigenen Speicher zeigen (typischerweise sowas wie ein Array, das im Konstruktor mit <code>new</code> reserviert wird und im Destruktor wieder <code>delete</code> d wird)</li>
<li>(b) Pointer, die auf &quot;außer-Klassen&quot;-Speicher zeigen, zB auf die Programm-Konfiguration</li>
</ul>
<p>Der Hauptgrund, Copy Konstruktoren zu überladen, erscheint mir zu sein, weil der Compiler (a) und (b) nicht unterscheiden kann. Im Fall von (a) muss der Speicher dupliziert werden. In C++11 scheint aus der &quot;rule of 3&quot; die &quot;rule of 5&quot; geworden zu sein, sodass ich oft auch noch Move Konstruktoren schreiben sollte. Um diesen &quot;manuellen&quot; Aufwand zu umgehen, suche ich nun sowas wie einen STL &quot;buffer&quot;, der einen Speicherbereich verwaltet und dessen Länge kennt, und der passend überladene Konstruktoren und Asignment Operatoren mitbringt. Dort sind mir <code>string</code> und <code>vector&lt;char&gt;</code> eingefallen. Mit meinem Code habe ich aber Bauchschmerzen, hier ein Bsp.</p>
<pre><code class="language-cpp">string line;
line.resize(line_len);
char* buffer = const_cast&lt;char*&gt;(line.data());
some_file.getline(buffer, line_len);
</code></pre>
<p>Ich brauche einen nicht- <code>const</code> anten <code>char*</code> pointer für manche Funktionen wie eben <code>getfile()</code> (oder wenn ich rohe Daten aus dem Netzwerk bekomme etc.)<br />
Was mir nicht gefällt:</p>
<ul>
<li>Ich greife &quot;an der Klasse&quot; vorbei direkt auf den Speicher zu.</li>
<li>Ich kann die String-Länge nicht manuell setzten. Daraus ergibt sich: Wenn ich statt <code>string::resize()</code> nur <code>string::reserve()</code> verwende, wird die String-Länge nicht angepasst (weil ich ja direkt in den Speicher schreibe). Die Länge ist aber wichtig. <code>string::resize()</code> &quot;initialisiert&quot; (d.h. &quot;nullt&quot;) den Speicher von der aktuellen Länge bis zur neuen größeren Länge - das ist etwas, was ich für meinen Buffer nicht brauche.</li>
</ul>
<p>Mit <code>vector&lt;char&gt;</code> habe ich die gleichen Sorgen, zumal mir hier der C++ Standard auch nicht garantiert, dass <code>&amp; vector&lt;char&gt;::front()</code> bedenkenlos nach <code>char*</code> gecastet werden kann (obwohl in der Praxis die Implementierungen der STL das erlauben). Ich könnte natürlich erst einen <code>char</code> -Buffer reservieren, dann dort hineinschreiben lassen, dann diesen Buffer einen Vector kopieren und dann den <code>char</code> -Buffer wieder freigeben, aber das ist mindestens ein Kopieren zu viel (und Speicher-Verschwendung). Das ist alles nicht so richtig schön. Hat jemand eine Idee, wie ich das besser machen könnte?</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/300313/quot-movable-quot-stl-buffer</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 21:13:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300313.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Feb 2012 18:50:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &amp;quot;movable&amp;quot; STL buffer? on Wed, 29 Feb 2012 19:00:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>in meinen Klassen mit Pointern als Member scheint es zwei Arten von Pointern zu geben:</p>
<ul>
<li>(a) Pointer, die auf eigenen Speicher zeigen (typischerweise sowas wie ein Array, das im Konstruktor mit <code>new</code> reserviert wird und im Destruktor wieder <code>delete</code> d wird)</li>
<li>(b) Pointer, die auf &quot;außer-Klassen&quot;-Speicher zeigen, zB auf die Programm-Konfiguration</li>
</ul>
<p>Der Hauptgrund, Copy Konstruktoren zu überladen, erscheint mir zu sein, weil der Compiler (a) und (b) nicht unterscheiden kann. Im Fall von (a) muss der Speicher dupliziert werden. In C++11 scheint aus der &quot;rule of 3&quot; die &quot;rule of 5&quot; geworden zu sein, sodass ich oft auch noch Move Konstruktoren schreiben sollte. Um diesen &quot;manuellen&quot; Aufwand zu umgehen, suche ich nun sowas wie einen STL &quot;buffer&quot;, der einen Speicherbereich verwaltet und dessen Länge kennt, und der passend überladene Konstruktoren und Asignment Operatoren mitbringt. Dort sind mir <code>string</code> und <code>vector&lt;char&gt;</code> eingefallen. Mit meinem Code habe ich aber Bauchschmerzen, hier ein Bsp.</p>
<pre><code class="language-cpp">string line;
line.resize(line_len);
char* buffer = const_cast&lt;char*&gt;(line.data());
some_file.getline(buffer, line_len);
</code></pre>
<p>Ich brauche einen nicht- <code>const</code> anten <code>char*</code> pointer für manche Funktionen wie eben <code>getfile()</code> (oder wenn ich rohe Daten aus dem Netzwerk bekomme etc.)<br />
Was mir nicht gefällt:</p>
<ul>
<li>Ich greife &quot;an der Klasse&quot; vorbei direkt auf den Speicher zu.</li>
<li>Ich kann die String-Länge nicht manuell setzten. Daraus ergibt sich: Wenn ich statt <code>string::resize()</code> nur <code>string::reserve()</code> verwende, wird die String-Länge nicht angepasst (weil ich ja direkt in den Speicher schreibe). Die Länge ist aber wichtig. <code>string::resize()</code> &quot;initialisiert&quot; (d.h. &quot;nullt&quot;) den Speicher von der aktuellen Länge bis zur neuen größeren Länge - das ist etwas, was ich für meinen Buffer nicht brauche.</li>
</ul>
<p>Mit <code>vector&lt;char&gt;</code> habe ich die gleichen Sorgen, zumal mir hier der C++ Standard auch nicht garantiert, dass <code>&amp; vector&lt;char&gt;::front()</code> bedenkenlos nach <code>char*</code> gecastet werden kann (obwohl in der Praxis die Implementierungen der STL das erlauben). Ich könnte natürlich erst einen <code>char</code> -Buffer reservieren, dann dort hineinschreiben lassen, dann diesen Buffer einen Vector kopieren und dann den <code>char</code> -Buffer wieder freigeben, aber das ist mindestens ein Kopieren zu viel (und Speicher-Verschwendung). Das ist alles nicht so richtig schön. Hat jemand eine Idee, wie ich das besser machen könnte?</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187102</guid><dc:creator><![CDATA[Lawilog]]></dc:creator><pubDate>Wed, 29 Feb 2012 19:00:20 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;movable&amp;quot; STL buffer? on Wed, 29 Feb 2012 18:57:53 GMT]]></title><description><![CDATA[<p>1. es gibt std::getline, um direkt in einen std::string zu lesen<br />
<a href="http://www.cplusplus.com/reference/string/getline/" rel="nofollow">http://www.cplusplus.com/reference/string/getline/</a></p>
<p>2. das ist ausdrücklich vorgesehen:</p>
<pre><code class="language-cpp">std::vector&lt;char&gt; v;
...
v.resize(20);
...
read( fd, &amp;v[0], v.size() );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2187106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187106</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 29 Feb 2012 18:57:53 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;movable&amp;quot; STL buffer? on Wed, 29 Feb 2012 18:58:11 GMT]]></title><description><![CDATA[<p>Laut C++11 müssen sowohl std::string als auch std::vector&lt;char&gt; ihren Speicher sequenziell anfordern, insofern sehe ich dein Problem nicht. Pointer bekommst du mit &amp;v[0] ohne Probleme. Wobei ich bei dem string eher die richtige Überladung für getline wählen würde, dann wird die Größe automatisch angepasst. Überhaupt frage ich mich wie du ohne vector und string C++ programmiert hast. oO</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187107</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Wed, 29 Feb 2012 18:58:11 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;movable&amp;quot; STL buffer? on Wed, 29 Feb 2012 18:58:27 GMT]]></title><description><![CDATA[<p>Lawilog schrieb:</p>
<blockquote>
<pre><code class="language-cpp">string line;
line.resize(line_len);
char* buffer = const_cast&lt;char*&gt;(line.data());
some_file.getline(buffer, line_len);
</code></pre>
</blockquote>
<p>Aua. RTFM.</p>
<p>Lawilog schrieb:</p>
<blockquote>
<p>Mit <code>vector&lt;char&gt;</code> habe ich die gleichen Sorgen, zumal mir hier der C++ Standard auch nicht garantiert, dass <code>vector&lt;char&gt;::front()</code> bedenkenlos nach <code>char*</code> gecastet werden kann (obwohl in der Praxis die Implementierungen der STL das erlauben).</p>
</blockquote>
<p>Doch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187108</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 29 Feb 2012 18:58:27 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;movable&amp;quot; STL buffer? on Wed, 29 Feb 2012 19:30:35 GMT]]></title><description><![CDATA[<p>Oh okay, <code>std::getline</code> lässt <code>istream::getline</code> natürlich zu einem schlechten Bsp. werden. Thx.</p>
<p>@manni66: hast du für diese read unter &quot;2.&quot; einen Link?</p>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>Lawilog schrieb:</p>
<blockquote>
<p>...zumal mir hier der C++ Standard auch nicht garantiert, dass <code>vector&lt;char&gt;::front()</code> bedenkenlos nach <code>char*</code> gecastet werden kann (obwohl in der Praxis die Implementierungen der STL das erlauben).</p>
</blockquote>
<p>Doch!</p>
</blockquote>
<p>Ich meine, dass ist nicht der Fall. Ist aber auch nur ein theoretisches Problem. In der Praxis gibt's glaube nur Diskussionen, was passiert wenn vector.empty() ist (und man debuggt oder so).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187127</guid><dc:creator><![CDATA[Lawilog]]></dc:creator><pubDate>Wed, 29 Feb 2012 19:30:35 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;movable&amp;quot; STL buffer? on Wed, 29 Feb 2012 19:38:46 GMT]]></title><description><![CDATA[<p>Lawilog schrieb:</p>
<blockquote>
<p>@manni66: hast du für diese read unter &quot;2.&quot; einen Link?</p>
</blockquote>
<p>Damit ist das ganz normale read für Filedescriptoren (und zumindest auf Unix auch Socketdescriptoren) gemeint. Meine Aussage ist aber allgemein auf alle Funktionen anwendbar, die einen char*-Buffer erwarten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187131</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 29 Feb 2012 19:38:46 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;movable&amp;quot; STL buffer? on Wed, 29 Feb 2012 20:08:11 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Lawilog schrieb:</p>
<blockquote>
<p>@manni66: hast du für diese read unter &quot;2.&quot; einen Link?</p>
</blockquote>
<p>Damit ist das ganz normale read für Filedescriptoren (und zumindest auf Unix auch Socketdescriptoren) gemeint. Meine Aussage ist aber allgemein auf alle Funktionen anwendbar, die einen char*-Buffer erwarten.</p>
</blockquote>
<p>OK. Dann muss ich trotzdem noch vorher <code>resize</code> n statt bloß <code>reserve</code> n (weil sich durch das <code>read()</code> nicht die <code>length()</code> von <code>vector</code> oder <code>string</code> ändert). Aber nagut, ich denke damit kann ich leben.</p>
<p>Danke Leute! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2187143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187143</guid><dc:creator><![CDATA[Lawilog]]></dc:creator><pubDate>Wed, 29 Feb 2012 20:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;movable&amp;quot; STL buffer? on Thu, 01 Mar 2012 07:09:24 GMT]]></title><description><![CDATA[<p>Lawilog schrieb:</p>
<blockquote>
<p>Ich meine, dass ist nicht der Fall. Ist aber auch nur ein theoretisches Problem. In der Praxis gibt's glaube nur Diskussionen, was passiert wenn vector.empty() ist (und man debuggt oder so).</p>
</blockquote>
<p>Wenn du glauben willst such dir eine Religion.</p>
<p>n3242 23.3.6.1/1 schrieb:</p>
<blockquote>
<p>The elements of a<br />
vector are stored contiguously, meaning that if v is a vector&lt;T, Allocator&gt; where T is some type other<br />
than bool, then it obeys the identity &amp;v[n] == &amp;v[0] + n for all 0 &lt;= n &lt; v.size().</p>
</blockquote>
<p>n3242 21.4.1/5 schrieb:</p>
<blockquote>
<p>The char-like objects in a basic_string object shall be stored contiguously. That is, for any basic_string<br />
object s, the identity &amp;*(s.begin() + n) == &amp;*s.begin() + n shall hold for all values of n such that 0<br />
&lt;= n &lt; s.size().</p>
</blockquote>
<p>Und wenn der vector leer ist willst du wohl auch eher nicht die Adresse auf seinen Speicher haben. <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187218</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 01 Mar 2012 07:09:24 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;movable&amp;quot; STL buffer? on Thu, 01 Mar 2012 07:38:00 GMT]]></title><description><![CDATA[<p>Übrigens, da es ja um C++11 geht: statt &amp;vec[0] oder &amp;vec.front() gibts auch für vector inzwischen die passende Methode: vec.data()</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187228</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 01 Mar 2012 07:38:00 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;movable&amp;quot; STL buffer? on Thu, 01 Mar 2012 07:53:25 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>vec.data()</p>
</blockquote>
<p>Aber ein string Äquivalent leider nicht, str.data() gibt immer noch einen const char* zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187232</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 01 Mar 2012 07:53:25 GMT</pubDate></item></channel></rss>