new[]



  • Das ist ok, denn in diesem Fall ist l keine constant expression.

    Ganz sicher bin ich nicht, warten wir auf camper.



  • Sone schrieb:

    Ganz sicher bin ich nicht, warten wir auf camper.

    Es stimmt schon so wie du sagst. Arrays dürfen laut Standard nicht Größe 0 haben, an new[] darf dagegen 0 übergeben werden. Zero sized Arrays werden als Spracherweiterung allerdings von vielen Compilern unterstützt...



  • doktor banane schrieb:

    ja, ich selbst schreibe ja in meinem code natürlich nicht, dass ich 0 elemente mit new[] erzeugen will, eher wird die anzahl der elemente durch eine berechnung bestimmt, welche unter umständen auch 0 ergeben kann.

    dot schrieb:

    Gerade in zeitkritischem Code will man kein new und delete haben... 😉

    Ja. Die Abfrage, ob der Wert gültig ist, ist deutlich effizienter, als ein unnötiger new[] oder delete[] call.





  • knivil schrieb:

    als Spracherweiterung

    Hmm ...
    http://stackoverflow.com/questions/1087042/c-new-int0-will-it-allocate-memory

    Wie gesagt, new T[0] ist durch eine Ausnahmeregelgung laut Standard erlaubt, T blub[0]; dagegen nicht, wird aber von einigen Compilern dennoch unterstützt... 😉



  • Wie gesagt, new T[0] ist durch eine Ausnahmeregelgung laut Standard erlaubt

    Nein, ist es ja gerade nicht!

    Arrays dürfen laut Standard nicht Größe 0 haben, an new[] darf dagegen 0 übergeben werden.

    Hast du überhaupt meine Zitate gelesen/verstanden?

    Es ging nie um normale Arrays, meine Zitate bezogen sich alle auf new . Und mein letztes hat AFAICS klar gezeigt, dass es nicht erlaubt ist... bzw. sein sollte.



  • Also laut Sutter ist new T[0] erlaubt:
    http://herbsutter.com/2009/09/02/when-is-a-zero-length-array-okay/

    ich habe nur keinen Standard bei der Hand aber prinzipiell vertraue ich Sutter bei sowas blind.



  • Ja, Sutter hat Recht. Ich habe mich vertan, bei den Zitaten...



  • Sone schrieb:

    Wie gesagt, new T[0] ist durch eine Ausnahmeregelgung laut Standard erlaubt

    Nein, ist es ja gerade nicht!

    Arrays dürfen laut Standard nicht Größe 0 haben, an new[] darf dagegen 0 übergeben werden.

    Hast du überhaupt meine Zitate gelesen/verstanden?

    Nach meiner Interpretation kommt der Part mit der constant expression nur bei mehrdimensionalen Arrays zu tragen, was auch Sinn macht... 😉



  • dot schrieb:

    Nach meiner Interpretation, kommt der Part mit der constant expression nur bei mehrdimensionalen Arrays zu tragen, was auch Sinn macht... 😉

    Jetzt hast du mich aber am Haken. Wie interpretierst du das denn genau? 🙂

    Oh.... verdammt... du hast Recht. Das bezieht sich auf Multidimensionale Arrays... ich wusste, da stimmt was nicht... ja, ich habe die Zitate nicht verstanden, verdammt. Die sind auch immer sowas von nicht selbsterklärend.

    Ja, da hast du Recht. Bei Multidimensionalen Heap-Arrays müssten die zusätzlichen Dimensionen alle konstant und strikt positiv sein. Sonst kann auch 0 benutzt werden. Das heißt der Code im OP ist richtig.

    hier schreibe ich in die eckigen klammern des new[]-operators selbst kein literal rein, die variable l lässt sich jedoch auf ein literal zurückführen. ist das dann okay?

    Es wäre auch Ok, wenn du das Literal direkt reinschreibst, wie du siehst, habe ich mich vertan.... 😃



  • Muss aber zugeben, ich hab mich davon auch erstmal verwirren lassen... 😉



  • Sone schrieb:

    Ganz sicher bin ich nicht, warten wir auf camper.

    Sone schrieb:

    Ja, Sutter hat Recht. Ich habe mich vertan, bei den Zitaten...

    Sone schrieb:

    Oh.... verdammt... du hast Recht. Das bezieht sich auf Multidimensionale Arrays... ich wusste, da stimmt was nicht... ja, ich habe die Zitate nicht verstanden, verdammt. Die sind auch immer sowas von nicht selbsterklärend.

    Wieder ein typischer Sone-Multifail.
    Im Gegensatz zur Situation vor einem Jahr hat sich eigentlich nur geändert, dass Du ständig den Standard zitierst aber kaum verstehst was drin steht.
    Endlich mal Fresse halten?



  • dass Du ständig den Standard zitierst aber kaum verstehst was drin steht.

    Nein, ich verstehe prinzipiell gut was drin steht. Das war ein verwirrender Fall.

    Zeig mir nochmal den letzten, wo ich den Standard zitiere und "kaum verstehe was drin steht".

    Endlich mal Fresse halten?

    Wieso sollte ich?

    Btw, was genau ist ein Multifail? Ich hatte nur ein Zitat falsch gedeutet, das ist alles. Und dabei das richtige noch im ersten Post gebracht. Das ist nichts schlimmes. Aber ich wusste genau, das gleich der nächste Spinner ankommt und das für seine Anti-Sone Kampagne ausnutzt.



  • okay, ich habe die diskussion soweit passiv beobachtet und bedanke mich nun für die aufklärung.



  • doktor banane schrieb:

    okay, ich habe die diskussion soweit passiv beobachtet und bedanke mich nun für die aufklärung.

    Da du nun aber schon auf der ersten Seite den Anwendungsfall genannt und den Code gezeigt hast, fühl' ich mich verpflichtet, dich davon zu unterrichten, dass das keine gute Idee ist, auch wenn es nun doch erlaubt ist:

    class c 
    { 
        bool *_d; 
        c(); 
    public: 
        c(unsigned l) : _d(new bool[l]) {} 
    };
    

    Vektoren darfst du genauso problemlos mit jeder Größe initialisieren, und ich bezweifle, dass der Performance-Verlust so groß ist..
    Falls doch, und die Performance sollte dann wirklich Druck machen, solltest du auf RAII achten um zumindest die Exception-Safety zu garantieren.

    Und außerdem Marthogs Tipp beachten:

    Ja. Die Abfrage, ob der Wert gültig ist, ist deutlich effizienter, als ein unnötiger new[] oder delete[] call.

    Zumindest den Ctor also so umschreiben:

    c(unsigned l) : _d(l ? new bool[l] : nullptr /*bzw. einfach NULL/0 */) {}
    

    Für sowas gibt es bspw. boost::scoped_array.

    Wie gesagt, wahrscheinlich kannst du auch vector benutzen.


  • Mod

    Sone schrieb:

    Oh, Stop! Nein, das sollte (ohne es jetzt zu pruefen) gar nicht kompilieren:

    Every constant-expression in a noptr-new-declarator shall be an integral constant expression (5.19) and evaluate to a strictly positive value.

    Das heisst, es darf 0 vorkommen, aber nur, wenn die Bounds zur Laufzeit vorgegeben werden. Wenn du da tatsaechlich 0 als Literal reinschreibst, dann darf das nicht kompilieren.

    Das Problem hier ist das fehlerhafte Zitieren.
    constant-expression ist kursiv, und das bezieht sich folglich (siehe 1.6) auf die Syntaxkategorie (folglich muss man automatisch noch einen Blick auf die Grammatik werfen, um den Sinn der Aussage zu erfassen) und nicht konstante Ausdrücke im Allgemeinen.


Anmelden zum Antworten