placement new auf stack



  • 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.



  • 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.)

    Ich hab's natürlich vergessen 😞 , aber dafür folgendes ergoogelt:
    http://www.devx.com/tips/Tip/12756

    Placement-New Requires Heap-Allocated Buffers
    The placement-new operator constructs an object on a pre-allocated buffer. The pre-allocated buffer has to be allocated on the heap.

    char *pbuff = new char[1024]; // heap allocation using plain new
    Person *p = new (pbuff) Person; // placement new uses a pre-allocated buffer
    You may be tempted to use a buffer allocated on the stack to avoid the need of explicitly freeing it:

    char pbuff [1024]; //bad idea: stack allocation instead of heap
    Person *p = new ( pbuff ) Person; //undefined behavior
    However, the pre-allocated buffer must comply with certain alignment constraints required by C++. Memory allocated on the heap is guaranteed to comply with these requirements.
    Stack memory, on the other hand, may not be properly aligned, and hence using it for that purpose yields undefined behavior.
    Danny Kalev

    Jetzt hilft eigentlich nur noch die C++ Norm.

    Gruß



  • Drehleiter schrieb:

    http://www.devx.com/tips/Tip/12756

    Placement-New Requires Heap-Allocated Buffers
    The placement-new operator constructs an object on a pre-allocated buffer. The pre-allocated buffer has to be allocated on the heap.

    char *pbuff = new char[1024]; // heap allocation using plain new
    Person *p = new (pbuff) Person; // placement new uses a pre-allocated buffer
    You may be tempted to use a buffer allocated on the stack to avoid the need of explicitly freeing it:

    char pbuff [1024]; //bad idea: stack allocation instead of heap
    Person *p = new ( pbuff ) Person; //undefined behavior
    However, the pre-allocated buffer must comply with certain alignment constraints required by C++. Memory allocated on the heap is guaranteed to comply with these requirements.
    Stack memory, on the other hand, may not be properly aligned, and hence using it for that purpose yields undefined behavior.
    Danny Kalev

    Jetzt hilft eigentlich nur noch die C++ Norm.

    Danny Kalev muss man nicht ernst nehmen. Der Typ ist keine Autorität. Außerdem ist der Artikel relativ alt. "Placement-New Requires Heap-Allocated Buffers" ist falsch. Das ist ein Nicht-Faktum, was er sich aus zwei Wahrheiten zusammengereimt hat: (a) "the pre-allocated buffer must comply with certain alignment constraints" und (b) "Memory allocated on the heap is guaranteed to comply with these requirements". Daraus folgt allerdings nicht "Placement-New Requires Heap-Allocated Buffers", weil der C++ Standard nicht sagt, dass Heap-Allocation die einzige Möglichkeit sei, zu einer korrekten Ausrichtung zu kommen. Mit alignment_of und aligned_storage (aus der TR1-Bibliothek und bald auch bei C++0x dabei) gibt es eine weitere Möglichkeit.

    Gruß,
    SP



  • danke - jetzt bin ich glücklich : >

    bb


Anmelden zum Antworten