placement new auf stack



  • Hallo,

    Ich bin mir nicht sicher, meine aber in einem der "effective C++" Bücher von Scott Meyers gelesen zu habe, dass placement new mit einem Stack-Objekt "böse" ist. (Wenn ich dran denke und dazu komme, schaue ich heute abend nach.)

    Im übrigen frage ich mich ob nicht boost::array oder std::tr1::array deine Anforderungen nicht auch erfüllen?

    Gruß



  • camper schrieb:

    Für richtige Ausrichtung ist noch zu sorgen:

    #include <type_traits>
    
    union
    {
        char data[sizeof(T)];
        typename std::tr1::aligned_storage<sizeof(T),std::tr1::alignment_of<T>::value>::type align;
    };
    

    Hier scheinen einige Leser das

    union
    

    übersehen zu haben und überlegen nun, wie man das ohne union schafft.



  • Ich stelle jetzt mal die Gretchenfrage: Welchen Sinn hat placement new mit Stackspeicher?



  • knivil schrieb:

    Ich stelle jetzt mal die Gretchenfrage: Welchen Sinn hat placement new mit Stackspeicher?

    Speed natürlich.



  • Ja, gegenueber new vielleicht, aber was ist denn mit std::array oder aber das Objekt gleich als lokale Variable anlegen?



  • knivil schrieb:

    Ja, gegenueber new vielleicht, aber was ist denn mit std::array oder aber das Objekt gleich als lokale Variable anlegen?

    Das ist natürlich besser. Deswegen kann ich meiner Vector-Klasse ja auch mitgeben, ob sie Freispeicher benutzt oder ein Member-Array.
    std::array ist keine Alternative, da es die supi vector-Funktionalität nicht hat. also push_back.



  • volkard schrieb:

    camper schrieb:

    Für richtige Ausrichtung ist noch zu sorgen:

    #include <type_traits>
    
    union
    {
        char data[sizeof(T)];
        typename std::tr1::aligned_storage<sizeof(T),std::tr1::alignment_of<T>::value>::type align;
    };
    

    Hier scheinen einige Leser das

    union
    

    übersehen zu haben und überlegen nun, wie man das ohne union schafft.

    soll so wie heißen, wie ich solls auch mit dem union machen?
    in meinen augen ist das bei nem einzelnen element zwar möglich, aber bei mehreren nur platzverschwendung... kann aber auch sein, dass ichs falsch verstanden hab - wie gesagt: hab dazu nix gefunden - allg. ist das tr1 auch 6jahre nach erscheinen noch so schlecht/wenig dokumentiert... :<

    volkard schrieb:

    std::array ist keine Alternative, da es die supi vector-Funktionalität nicht hat. also push_back.

    Japp - hatte ich auch weiter oben schon mal geschrieben

    Drehleiter schrieb:

    Ich bin mir nicht sicher, meine aber in einem der "effective C++" Bücher von Scott Meyers gelesen zu habe, dass placement new mit einem Stack-Objekt "böse" ist. (Wenn ich dran denke und dazu komme, schaue ich heute abend nach.)

    das wäre cool : >

    bb



  • unskilled schrieb:

    in meinen augen ist das bei nem einzelnen element zwar möglich, aber bei mehreren nur platzverschwendung...

    Richte doch das ganze Array aus und nicht einzeln jedes Element.



  • unskilled schrieb:

    volkard schrieb:

    std::array ist keine Alternative, da es die supi vector-Funktionalität nicht hat. also push_back.

    Japp - hatte ich auch weiter oben schon mal geschrieben

    Yup. Aber knivil hat's ignoriert und zur Gretchenfrage gemacht. Deswegen hab ich's ihm nochmal gesagt.



  • volkard schrieb:

    unskilled schrieb:

    in meinen augen ist das bei nem einzelnen element zwar möglich, aber bei mehreren nur platzverschwendung...

    Richte doch das ganze Array aus und nicht einzeln jedes Element.

    Tu ich doch!?

    template <typename T, std::size_t count> 
    struct stack_allocator 
    { 
        enum 
        { 
            allocating_size = count, 
            allocating_byte = allocating_size*sizeof(T) + std::tr1::alignment_of<T>-1 
        }; 
    
    /*...*/ 
    
        pointer allocate(size_type n, stack_allocator<void, 0>::const_pointer /*hint*/ = 0) 
        { 
            if(n > allocating_size) 
                throw std::bad_alloc(); 
    
            if(!empty) 
                throw std::bad_alloc(); 
    
            empty = false; 
            size_type begin = reinterpret_cast<size_type>( data ); 
            size_type offset = begin%std::tr1::alignment_of<T>::value; 
            pointer first = reinterpret_cast<pointer>( begin+offset ); 
            return first; 
        } 
    };
    

    oder gibts hier ein problem?
    mit offset berechne ich ja, welchen zeiger ich rausgebe und somit, wo das erste element gespeichert wird...

    bb



  • Dieser Thread macht mich traurig.



  • volkard schrieb:

    Dieser Thread macht mich traurig.

    wie wärs, wenn du mal sagen würdest, was du für nen fehler hältst!? bzw. was dir hier nicht passt...

    bb



  • unskilled schrieb:

    volkard schrieb:

    Dieser Thread macht mich traurig.

    wie wärs, wenn du mal sagen würdest, was du für nen fehler hältst!?

    Alles. Vom Ansinnen, so einen allocator zu bauen übers Ignorieren des union-Tricks über Pseudogretchenfragen über falsche Erinnerungen an Scotty bis zum "!?", wo doch nur ein "?!" passen kann. Es ist ja keiein Ausruf, der als Frage gemein ist, sondern eine Frage, die ausgerufen wird.



  • volkard schrieb:

    so einen allocator zu bauen

    was würdest du tun? nen c-array mit push back etc. bauen?
    selbst, wenn man das hätte müsste man dann noch std::back_inserter spezialisieren...
    das scheint mir wesentlich mehr arbeit zu sein...
    außerdem ist die allocator-klasse doch genau dazu da...

    volkard schrieb:

    Ignorieren des union-Tricks

    ignoriert hab ich ihn nicht - aber ich weiß nicht, in wie fern ich den übernehmen soll... ich kann natürlich nen array mit dem union bauen, also union_type data[size]; - und brauch dann unter umständen nen vielfaches des speichers - du würdest es wohl aber so machen?
    am liebsten würde ich ja bevor ich das array deklariere ein dummy-char-array haben, was so viele einträge hat, dass das array danach zwangsläufig am richtigen platz anfängt - allerdings bin ich mir unsicher, ob das hier wirklich richtig ist:

    #include <type_traits>
    
    template <typename T>
    struct x
    {
      enum { count = 123 };
    
      typename std::tr1::aligned_storage<sizeof(T), std::tr1::alignment_of<T>::value>::type alignment;
    
      char data[sizeof(T)*count];
    };
    

    imho würde bei dieser möglichkeit - wie auch bei einem versuch mit union nicht das gewünschte resultat herauskommen...

    volkard schrieb:

    bis zum "!?", wo doch nur ein "?!" passen kann

    nö - bei mir ist !? weniger Frage als ?! ;P

    bb



  • unskilled schrieb:

    was würdest du tun? nen c-array mit push back etc. bauen?

    Diese Verwendung von "nen" paßt mich auch nicht. http://www.welt.de/print-welt/article208701/Kanak_Sprak.html
    Daher habe ich keine Lust zu sagen, daß ich einfach eine ganze Vector-Klasse bauen würde, und auch nicht, daß die union nur aus dem ausrichter und dem nutzspeicherarray bestehen muß.



  • volkard schrieb:

    Yup. Aber knivil hat's ignoriert

    Ich hatte extra auf Seite 1 hier gesucht, aber nichts vergleichbares gefunden.



  • volkard schrieb:

    .... und auch nicht, daß die union nur aus dem ausrichter und dem nutzspeicherarray bestehen muß.

    ... weil die Union so ausgerichtet wird, wie es für ihr größtes Member nötig wäre.

    Nur damit das auch da steht.

    Nebenbei, wenn man sich so ansieht, wie du auf die Großschreibung und die richtige Schreibweise von "daß" achtest, kann man die Haarspalterei bei "!?" nicht ganz verstehen. 😉

    @unskilled
    Oje, das -1 bezog sich allein auf die Größe. Das hab ich total falsch verstanden gehabt. So ist es klar. Danke für die gelungene Visualisierung. 😃



  • Mitleid schrieb:

    Nebenbei, wenn man sich so ansieht, wie du auf die Großschreibung und die richtige Schreibweise von "daß" achtest, kann man die Haarspalterei bei "!?" nicht ganz verstehen. 😉

    Daß ich mit der kleinschreibung viele Fehler mache, ist mir bewußt. Aber daß ich "daß" falsch machen würde, möchte ich mir nicht sagen lassen. Oder sollte ich es verlernt haben und auf einmal dort Fehler machen? Zeig mir mal einen.



  • volkard schrieb:

    ... Zeig mir mal einen.

    Geschenkt! Old School ist in diesem Fall kein Fehler, jedoch existiert dafür immerhin eine Art Norm bzw. Vorgabe, die es für "!?" nicht gibt (der Wiki-Artikel zu Interrobang ist mir bereits bekannt).

    Dennoch werde ich in Zukunft darauf achten "?!" zu schreiben, einfach weil es mir jetzt besser gefällt. Das gestern war ein Ausrutscher! 😃 😃 😃


  • Mod

    Mitleid schrieb:

    Oje, das -1 bezog sich allein auf die Größe. Das hab ich total falsch verstanden gehabt. So ist es klar. Danke für die gelungene Visualisierung. 😃

    Das war Faulheitseingabe, weil ich gerade nur den Trackball in der Hand hatte -> Bildschirmtastatur. Deshalb Kürze.


Anmelden zum Antworten