<?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[Default-Initialization vermeiden]]></title><description><![CDATA[<p>Nabend,</p>
<pre><code>std::vector&lt;T&gt; big_vector(n)
</code></pre>
<p>Kann ich hier irgendwie vermeiden, dass sämtliche n Einträge initialisiert werden?<br />
Vielleicht mit einem custom allocator, der nur alloziert? (damit kenne ich mich nicht aus).<br />
Ich kann natürlich einfach ein normales mit new erzeugtes array wrappen, aber ich will den Code nicht unnötig aufblähen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/331188/default-initialization-vermeiden</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 22:19:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/331188.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 15 Feb 2015 16:09:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 16:09:18 GMT]]></title><description><![CDATA[<p>Nabend,</p>
<pre><code>std::vector&lt;T&gt; big_vector(n)
</code></pre>
<p>Kann ich hier irgendwie vermeiden, dass sämtliche n Einträge initialisiert werden?<br />
Vielleicht mit einem custom allocator, der nur alloziert? (damit kenne ich mich nicht aus).<br />
Ich kann natürlich einfach ein normales mit new erzeugtes array wrappen, aber ich will den Code nicht unnötig aufblähen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442818</guid><dc:creator><![CDATA[DaPeter]]></dc:creator><pubDate>Sun, 15 Feb 2015 16:09:18 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 16:21:34 GMT]]></title><description><![CDATA[<p>Eventuell</p>
<pre><code class="language-cpp">vector&lt;T&gt; v;
v.reserve(n);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2442825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442825</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Sun, 15 Feb 2015 16:21:34 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 16:27:42 GMT]]></title><description><![CDATA[<p>Schon probiert, undefined behavoir, weil size() nicht gesetzt ist.</p>
<p>Mit g++ und clang läuft das ohne Probleme durch. Visual C++ kompiliert zwar ohne Warnung, aber stürzt dann beim Ausführen ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442828</guid><dc:creator><![CDATA[DaPeter]]></dc:creator><pubDate>Sun, 15 Feb 2015 16:27:42 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 16:41:08 GMT]]></title><description><![CDATA[<p>DaPeter schrieb:</p>
<blockquote>
<p>Schon probiert, undefined behavoir, weil size() nicht gesetzt ist.</p>
</blockquote>
<p>Ähm. Nein? <code>reserve()</code> ändert nur den im voraus <em>reservierten</em> Platz für Elemente ... das wirkt sich auf <code>capacity()</code> aus ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442830</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sun, 15 Feb 2015 16:41:08 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 16:44:35 GMT]]></title><description><![CDATA[<p>Hm, trotzdem stürzt es mir dann ab, wenn ich mit [] etwas zuweisen will (nur bei Visual C++).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442832</guid><dc:creator><![CDATA[DaPeter]]></dc:creator><pubDate>Sun, 15 Feb 2015 16:44:35 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 16:49:05 GMT]]></title><description><![CDATA[<p>Was ist denn genau deine Anforderung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442833</guid><dc:creator><![CDATA[firefly]]></dc:creator><pubDate>Sun, 15 Feb 2015 16:49:05 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 16:54:47 GMT]]></title><description><![CDATA[<p>DaPeter schrieb:</p>
<blockquote>
<p>Hm, trotzdem stürzt es mir dann ab, wenn ich mit [] etwas zuweisen will (nur bei Visual C++).</p>
</blockquote>
<p>Ja, und das ist auch richtig so.</p>
<p>Denn wenn du eine capacity von n hast, aber eine size von 0. Dann kannst du per operator[] auf kein Element zugreifen, da ja keins da ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442834</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 15 Feb 2015 16:54:47 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 16:55:04 GMT]]></title><description><![CDATA[<p>DaPeter schrieb:</p>
<blockquote>
<p>Hm, trotzdem stürzt es mir dann ab, wenn ich mit [] etwas zuweisen will (nur bei Visual C++).</p>
</blockquote>
<p>Nicht &quot;trotzdem&quot; sondern &quot;weil&quot;. Da worauf du mit <code>[]</code> zugreifen willst, da ist noch nix. Du musst dann schon Objekte deiner Vorstellung mit Hausnummer <code>push_back()</code> hintun.</p>
<p>Beantworte die Frage von firefly!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442835</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sun, 15 Feb 2015 16:55:04 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 16:57:46 GMT]]></title><description><![CDATA[<p>Ich möchte einfach die default-init vermeiden aus Performancegründen (ich hab die Zeit gemessen), da der vector recht groß ist. Ich möchte danach aber trotzdem mit operator[] nutzen können. reserve() ändert nur die capacity, nicht die size, daran scheint sich Visual C++ zu stören.</p>
<p>Folgendes funktioniert:</p>
<pre><code>T * v = new T[v];
// ..
// operator[] funktioniert
// ...
// delete [] v;
</code></pre>
<p>Das ist performancemäßig deutlich besser, da nicht initialisiert wird. Ich kann das natürlich wrappen in nen struct, damit ich das genauso benutzen kann, wie einen std::vector, aber ich will den Code nicht unnötig aufblähen.<br />
Deswegen möchte ich lieber den normalen std::vector nutzen und frage deswegen hier, ob ich irgendwas übersehen habe, um das zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442836</guid><dc:creator><![CDATA[DaPeter]]></dc:creator><pubDate>Sun, 15 Feb 2015 16:57:46 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 17:03:44 GMT]]></title><description><![CDATA[<p>Wie schaut denn so eine <code>v[x]</code> -Zeile aus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442838</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sun, 15 Feb 2015 17:03:44 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 17:07:39 GMT]]></title><description><![CDATA[<p>DaPeter schrieb:</p>
<blockquote>
<p>Das ist performancemäßig deutlich besser, da nicht initialisiert wird.</p>
</blockquote>
<p>Nein, für jedes Element wird der default-Konstruktor aufgerufen*. Nichts anderes macht das mit std::vector auch.</p>
<p>*Wenn du das nicht glaubst: delete den Default-Konstruktor von T. Kompiliert nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442840</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 15 Feb 2015 17:07:39 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 17:31:53 GMT]]></title><description><![CDATA[<p>Es macht auch wenig Sinn, ein uninitialisiertes Objekt im Programm zu haben.</p>
<p>Lediglich bei den primitiven Datentypen ist es sinnvoll, weil man damit ein Array in konstanter Zeit reservieren kann und nicht noch alles initialisieren muss, allerdings sind die standardlibraries heutzutage vermutlich in der Lage diese Optimierung in std::vector ebenfalls auszufuehren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442845</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Sun, 15 Feb 2015 17:31:53 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 17:33:27 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29873">@Nathan</a></p>
<p>Du hast Recht, sry. Ich habe jetzt mal etwas rumgegoogelt. Wenn ich new benutze, dann wird default-initialisiert. Wenn ich std::vector benutze, dann wird immer value-initialisiert, auch wenn ich keinen expliziten Wert angeben. (<a href="http://stackoverflow.com/questions/7218574/avoiding-default-construction-of-elements-in-standard-containers" rel="nofollow">http://stackoverflow.com/questions/7218574/avoiding-default-construction-of-elements-in-standard-containers</a>)</p>
<p>Da gibts scheinbar keine schöne bereits in C++ eingebaute Lösung dafür.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442846</guid><dc:creator><![CDATA[DaPeter]]></dc:creator><pubDate>Sun, 15 Feb 2015 17:33:27 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 17:38:04 GMT]]></title><description><![CDATA[<p>Doch, zur Not speicherst du halt Pointer im vector (d.h. std::unique_ptr).</p>
<p>Aber wie alle vor mir schon gesagt haben, was genau hast du vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442847</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 15 Feb 2015 17:38:04 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 18:01:52 GMT]]></title><description><![CDATA[<p>DaPeter schrieb:</p>
<blockquote>
<p>Da gibts scheinbar keine schöne bereits in C++ eingebaute Lösung dafür.</p>
</blockquote>
<p>Natürlich nicht!<br />
Du <em>willst</em> dass der Konstruktor eines Elementes aufgerufen wird, bevor du es verwendest. Darauf <em>verlasen</em> sich nicht triviale Typen!<br />
Wenn du nicht willst, dass direkt für alle Elemente ein Konstruktor aufgerufen wird, nutz reserve. Dann kannst du das gezielt steuern. Aber aufgerufen werden muss der, bevor die Typen verwendest.</p>
<p>Beschreib nochmal, was genau du vorhast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442857</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 15 Feb 2015 18:01:52 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Sun, 15 Feb 2015 20:34:25 GMT]]></title><description><![CDATA[<p>Ich denke mal, sein Problem ist, dass bei</p>
<p>std::vector&lt;int&gt; v(100);</p>
<p>alle Werte mit 0 initialisiert werden. Bei</p>
<p>int* v = new int[100]</p>
<p>bleiben die Werte uninitialisiert. Die 0-Initialisierung beim vector wirkt sich nachteilig auf die Laufzeit aus.</p>
<p>push_back vom vector kann man nur verwenden, wenn man das Array sequentiell füllt. Wenn man beispielsweise eine inverse Permuation eines anderen Arrays berechnen möchte, hilft einem das nicht weiter.</p>
<p>Man könnte so eine Konstruktion wie</p>
<p>struct A {int x};</p>
<p>verwenden, aber die Verwendung im Code ist dann etwas umständlicher (da man immer &quot;.x&quot; schreiben muss). Oder man überläd alle Operatoren von int für A, aber das ist auch sehr viel Arbeit.</p>
<p>Ich glaube eine schöne und kurze Lösung gibt es nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442877</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sun, 15 Feb 2015 20:34:25 GMT</pubDate></item><item><title><![CDATA[Reply to Default-Initialization vermeiden on Mon, 16 Feb 2015 07:23:49 GMT]]></title><description><![CDATA[<p>DaPeter schrieb:</p>
<blockquote>
<p>Nabend,</p>
<pre><code>std::vector&lt;T&gt; big_vector(n)
</code></pre>
<p>Kann ich hier irgendwie vermeiden, dass sämtliche n Einträge initialisiert werden?<br />
Vielleicht mit einem custom allocator, der nur alloziert? (damit kenne ich mich nicht aus).<br />
Ich kann natürlich einfach ein normales mit new erzeugtes array wrappen, aber ich will den Code nicht unnötig aufblähen.</p>
</blockquote>
<p>Du musst die Initialisierung halt inline und schnell machen. Anders geht es nicht.</p>
<p>Wenn Du einen std::vector mit n Elementen hast, dann hast Du die Garantie, dass die Elemente auch funktionieren. Und das kann nur ein Konstruktor leisten.</p>
<p>Denke mal daran, dass T ja auch ein Objekt sein kann, der im Destruktor etwas mit seinen Elementen macht. Ist da ein Zeiger dabei, der nicht initialisiert ist, dann gibt es Probleme.</p>
<p>Du kannst übrigens auch dem Konstruktor von std::vector einen 2. Parameter mit geben, der zum initialisieren verwendet wird. Beispielsweise:</p>
<pre><code>std::vector&lt;MyClass&gt; big_vector(4711, MyClass::null())
</code></pre>
<p>Dann wird nicht der Default-Konstruktor aufgerufen sondern der copy-Konstruktor. Das könnte unter Umständen billiger sein.</p>
<p>Eine andere Möglichkeit ist, wie bereits erwähnt mit <code>reserve</code> Speicher bereits zu reservieren. Dann kannst Du aber nicht einfach auf die Elemente zugreifen. Aber Du kannst sie durch push_back (oder emplace_back) bei Bedarf erzeugen, ohne dass eine Allokation des Vectors statt findet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442908</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Mon, 16 Feb 2015 07:23:49 GMT</pubDate></item></channel></rss>