<?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[stackobjekte und new]]></title><description><![CDATA[<p>Moin,</p>
<p>ich habe eine methode in der eine struct A</p>
<pre><code>typedef struct A
{
  public:
    A* childs;
    char count;

    A() : childs(0), count(0) {}
    A(char ct) : childs(new A[ct]), count(ct) {}
}A;
</code></pre>
<p>mit A a = A(n) auf dem stack erzeugt wird und childs mit n initialisiert wird,<br />
normalerweise folgt ja auf jedes new ein delete[], ist das hier auch so oder<br />
löst sich das von selbst?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317603/stackobjekte-und-new</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 15:27:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317603.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 14 Jun 2013 07:20:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 07:20:10 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>ich habe eine methode in der eine struct A</p>
<pre><code>typedef struct A
{
  public:
    A* childs;
    char count;

    A() : childs(0), count(0) {}
    A(char ct) : childs(new A[ct]), count(ct) {}
}A;
</code></pre>
<p>mit A a = A(n) auf dem stack erzeugt wird und childs mit n initialisiert wird,<br />
normalerweise folgt ja auf jedes new ein delete[], ist das hier auch so oder<br />
löst sich das von selbst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330983</guid><dc:creator><![CDATA[Pria]]></dc:creator><pubDate>Fri, 14 Jun 2013 07:20:10 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 07:27:33 GMT]]></title><description><![CDATA[<p>Auf dem Stack laden nur ein Zeiger und die Länge. Die A-Kindobjekte werden auf dem Heap erzeugt. Du musst einen Destruktor bereitstellen, welcher den Speicher wieder frei gibt.</p>
<p>Oder gleich einen Container (std::vector, std::list) verwenden und dir das Gehampel (und die mögliche Fehlerquelle) sparen.</p>
<p>Weiterhin sieht die Typdeklaration sehr C-mäßig aus.</p>
<p>Grüße ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330986</guid><dc:creator><![CDATA[Stechus Kaktus]]></dc:creator><pubDate>Fri, 14 Jun 2013 07:27:33 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 07:31:36 GMT]]></title><description><![CDATA[<blockquote>
<p>mit A a = A(n) auf dem stack erzeugt wird</p>
</blockquote>
<p>Wie mein Vorposter schon gesagt hat, erzeugst du das Array mit <code>new</code> , welches immer vom Heap allokiert (wenn überhaupt).</p>
<p>Pria schrieb:</p>
<blockquote>
<p>ist das hier auch so oder<br />
löst sich das von selbst?</p>
</blockquote>
<p>Nein, das löst sich nicht von selbst. Deswegen benutzt man new immer mit RAII. Oder am Besten gar nicht.</p>
<p>Aus genau dem Grund verwirfst du bitte diesen unfassbaren Teufelsschmaus* und verwendest einen STL-Container.</p>
<pre><code>struct A
{
  public:
    std::vector&lt;A&gt; childs;

    A() : childs(0) {}

    // Bzw. std::vector&lt;A&gt;::size_type
    A(std::size_t ct) : childs(ct) {}
};
</code></pre>
<p>Außerdem sind elaborated type specifier in C++ nicht mehr Pflicht, daher ist dieses <code>typedef struct</code> -Idiom nicht nötig.</p>
<p>*char für die Anzahl?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330987</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 14 Jun 2013 07:31:36 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 08:57:27 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Aus genau dem Grund verwirfst du bitte diesen unfassbaren Teufelsschmaus* und verwendest einen STL-Container</p>
</blockquote>
<p>Nein! Ich brauch die Geschwindigkeit die mir ein vector oder list nicht bieten kann.</p>
<p>Sone schrieb:</p>
<blockquote>
<p>char für die Anzahl?</p>
</blockquote>
<p>Ist nie höher als 255 daher speichertechnisch besser</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331011</guid><dc:creator><![CDATA[Pria]]></dc:creator><pubDate>Fri, 14 Jun 2013 08:57:27 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 09:04:04 GMT]]></title><description><![CDATA[<p>Pria schrieb:</p>
<blockquote>
<p>Nein! Ich brauch die Geschwindigkeit die mir ein vector oder list nicht bieten kann.</p>
</blockquote>
<p>Dann also:</p>
<pre><code>...
public:
   ...
   ~A(){delete [] childs;}
   ...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2331014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331014</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 14 Jun 2013 09:04:04 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 09:06:55 GMT]]></title><description><![CDATA[<p>Ja klar, bau ich gerade ein bzw. ein Dispose()</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331015</guid><dc:creator><![CDATA[Pria]]></dc:creator><pubDate>Fri, 14 Jun 2013 09:06:55 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 09:13:04 GMT]]></title><description><![CDATA[<p>Pria schrieb:</p>
<blockquote>
<p>Ich brauch die Geschwindigkeit […] daher speichertechnisch besser</p>
</blockquote>
<p>Bei welcher Anwendung hast du denn derartige Anforderungen an Geschwindigkeit und Speicherverbrauch? Es handelt sich hier bestenfalls um ein paar Takte ( <code>vector</code> und <code>new[]</code> sollten quasi identisch sein) und wenige zusätzliche Byte, für die du auf viel Fehlersicherheit und Komfort verzichtest (du brauchst nämlich, wenn du es manuell machst, auch noch einen Copy-Ctor und einen Zuweisungoperator, dazu musst du ständig wegen Exceptions aufpassen usw.).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331016</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Fri, 14 Jun 2013 09:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 09:27:33 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Es handelt sich hier bestenfalls um ein paar Takte ( <code>vector</code> und <code>new[]</code> sollten quasi identisch sein)</p>
</blockquote>
<p>Laut meiner Messung mit QueryPerformanceCounter ist .push_back um etwa 1/3 langsamer als eine Pointerzuweisung wenn ich keine geeignete Listengröße vorgebe, da ich diese aber kenne, da diese statisch pro durchgang bekannt ist kann ich genausogut ein * Array nehmen und mit ++ durchiterieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331018</guid><dc:creator><![CDATA[Pria]]></dc:creator><pubDate>Fri, 14 Jun 2013 09:27:33 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 09:31:37 GMT]]></title><description><![CDATA[<p>Wenn du die größe kennst, kannst du per vector::reserve() auch den Speicher im vorhinein reservieren lassen, dann ist push_back nur noch eine zuweisung und ein ++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331020</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 14 Jun 2013 09:31:37 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 09:40:05 GMT]]></title><description><![CDATA[<p>Pria schrieb:</p>
<blockquote>
<p>Ja klar, bau ich gerade ein bzw. ein Dispose()</p>
</blockquote>
<p>Dispose()?<br />
Sprechen wir noch von C++ oder von was anderem wie Microsoft-C++ mit .net?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331022</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 14 Jun 2013 09:40:05 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 09:41:32 GMT]]></title><description><![CDATA[<p>Pria schrieb:</p>
<blockquote>
<p>ipsec schrieb:</p>
<blockquote>
<p>Es handelt sich hier bestenfalls um ein paar Takte ( <code>vector</code> und <code>new[]</code> sollten quasi identisch sein)</p>
</blockquote>
<p>Laut meiner Messung mit QueryPerformanceCounter ist .push_back um etwa 1/3 langsamer als eine Pointerzuweisung wenn ich keine geeignete Listengröße vorgebe, da ich diese aber kenne, da diese statisch pro durchgang bekannt ist kann ich genausogut ein * Array nehmen und mit ++ durchiterieren.</p>
</blockquote>
<p>Bitte nur im Release-Modus mit allen Optimierungen messen, und nur mit ausgeschalteten Bereichsüberprüfungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331023</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 14 Jun 2013 09:41:32 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 09:56:37 GMT]]></title><description><![CDATA[<p>Pria schrieb:</p>
<blockquote>
<p>ipsec schrieb:</p>
<blockquote>
<p>Es handelt sich hier bestenfalls um ein paar Takte ( <code>vector</code> und <code>new[]</code> sollten quasi identisch sein)</p>
</blockquote>
<p>Laut meiner Messung mit QueryPerformanceCounter ist .push_back um etwa 1/3 langsamer als eine Pointerzuweisung wenn ich keine geeignete Listengröße vorgebe, da ich diese aber kenne, da diese statisch pro durchgang bekannt ist kann ich genausogut ein * Array nehmen und mit ++ durchiterieren.</p>
</blockquote>
<p>Du verwendest ihn nur falsch. vector::push_back entspricht in etwa:</p>
<pre><code>void push_back(T const&amp; elem)
{
    if(is_storage_full())
    {
         get_larger_storage();
         copy_everything_to_new_storage();
         destroy_old_storage();
    }

    insert_at_end(elem);
}
</code></pre>
<p>Was du vermutlich möchtest ist</p>
<p>a.)</p>
<pre><code>vector&lt;unsigned&gt; v;
v.reserve(N);
for(unsigned i = 0; i &lt; N; ++i)
    v.push_back(i);
</code></pre>
<p>b.)</p>
<pre><code>vector&lt;unsigned&gt; v;
v.resize(N);
for(unsigned i = 0; i &lt; N; ++i)
    v[i] = i;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2331026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331026</guid><dc:creator><![CDATA[Ethon_]]></dc:creator><pubDate>Fri, 14 Jun 2013 09:56:37 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 10:13:32 GMT]]></title><description><![CDATA[<p>Pria schrieb:</p>
<blockquote>
<p>Nein! Ich brauch die Geschwindigkeit die mir ein vector oder list nicht bieten kann.</p>
</blockquote>
<p>Wie schon von mehreren Geschrieben ist deine Aussage Unsinn. Die C++ Standardbibliothek ist in erster Linie auf Geschwindigkeit ausgelegt, man sollte aber auch wissen, wie man diese einsetzt.</p>
<p>Wenn man sie falsch einsetzt (oder gar im Debug testet), kommt natürlich Unsinn raus. In deinem Fall ist deine Variante sogar höchst gefährlich.</p>
<p>1. Verwendest du Zeiger/new/delete ohne zu wissen was du tust<br />
2. Würde in deiner Variante ein Destruktor alleine auch nicht reichen (Du müsstest entweder noch den Kopierkonstruktor/Zuweisungsoperator mitliefern, oder selbige unterbinden)...</p>
<p>Pria schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>char für die Anzahl?</p>
</blockquote>
<p>Ist nie höher als 255 daher speichertechnisch besser</p>
</blockquote>
<p>Einerseits redest du von Performance, anderseits möchtest du auf Speicher hin optimieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331034</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 14 Jun 2013 10:13:32 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 12:01:33 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Pria schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>char für die Anzahl?</p>
</blockquote>
<p>Ist nie höher als 255 daher speichertechnisch besser</p>
</blockquote>
<p>Einerseits redest du von Performance, anderseits möchtest du auf Speicher hin optimieren?</p>
</blockquote>
<p>Beides geht nämlich nicht.<br />
Entweder du berechnest die Länge eines Strings anhand einer Schleife bei jedem length() Aufruf oder du speicherst sie als Member. Die eine Version ist speicherfreundlich, die andere schnell.</p>
<p>Wozu brauchst du die Optimierung? Optimiere erst, wenn alles fertig ist und dein Programm zu langsam ist. Und dann nur die Parts, die am meisten etwas ausmachen und nicht alles (80/20-Regel).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331071</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 14 Jun 2013 12:01:33 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 12:32:00 GMT]]></title><description><![CDATA[<p>wenn es eine Number Cruncher Software ist, muß man schon ganz am Anfang 100% optimieren, siehe z.B. hier:</p>
<p><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331091</guid><dc:creator><![CDATA[dd++ 0]]></dc:creator><pubDate>Fri, 14 Jun 2013 12:32:00 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 12:36:36 GMT]]></title><description><![CDATA[<p>dd++ schrieb:</p>
<blockquote>
<p>wenn es eine Number Cruncher Software ist, muß man schon ganz am Anfang 100% optimieren</p>
</blockquote>
<p>Aber ganz sicher nicht mit <code>operator new[]</code> . Der ist saulahm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331095</guid><dc:creator><![CDATA[crunchit]]></dc:creator><pubDate>Fri, 14 Jun 2013 12:36:36 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 13:47:32 GMT]]></title><description><![CDATA[<p>Jap. POD-Arrays legt man auch in C++ lieber mit malloc an wenn jeder Furz an Performance zählt da malloc keine Konstruktoren aufruft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331149</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 14 Jun 2013 13:47:32 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 13:54:44 GMT]]></title><description><![CDATA[<p>Seit wann ruft <code>new[]</code> bei POD-Typen (nach C++98) Konstruktoren auf?</p>
<p>Ausserdem kann man, wenn man Konstruktoren definiert, auch eine Uninitialized-Version anbieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331152</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 14 Jun 2013 13:54:44 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 13:56:18 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Jap. POD-Arrays legt man auch in C++ lieber mit malloc an wenn jeder Furz an Performance zählt da malloc keine Konstruktoren aufruft.</p>
</blockquote>
<p>Ähh, new auch nicht, wenn's nicht nötig ist. Und wenn's doch nötig ist, dann ist es nötig <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="😉"
    /> und man muss new nehmen.</p>
<p>Wie sollte new denn auch bei POD einen Konstruktor aufrufen? Es gibt schließlich keinen.</p>
<p>P.S.: Geht es nur mir so oder hat noch jemand anderes das Gefühl, dass der TE sich hier selber das Leben schwer macht? Widersprüchliche Optimierungsstrategien, Messungen offensichtlich im Debugmodus durchgeführt, mythische Ansichten über die Standardbibliothek. Klingt alles so, als habe jemand mal davon gehört, dass Optimierung ganz was tolles ist, ein paar Tricks gesehen, aber nicht verstanden hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331154</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 14 Jun 2013 13:56:18 GMT</pubDate></item><item><title><![CDATA[Reply to stackobjekte und new on Fri, 14 Jun 2013 14:10:34 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>P.S.: Geht es nur mir so oder hat noch jemand anderes das Gefühl, dass der TE sich hier selber das Leben schwer macht? Widersprüchliche Optimierungsstrategien, Messungen offensichtlich im Debugmodus durchgeführt, mythische Ansichten über die Standardbibliothek. Klingt alles so, als habe jemand mal davon gehört, dass Optimierung ganz was tolles ist, ein paar Tricks gesehen, aber nicht verstanden hat.</p>
</blockquote>
<p>Ja, &quot;Ich brauch die Geschwindigkeit die mir ein vector oder list nicht bieten kann&quot; sollte als erstes Alarmsignal ernst genommen werden.</p>
<p>Ich hoffe, wir können Pria noch auf die gute Seite bringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331162</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 14 Jun 2013 14:10:34 GMT</pubDate></item></channel></rss>