Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : new[] ueberladen


del_4901
2011-06-25, 14:14:01
mein Visual 2010 legt am Anfang des (von mir) vergebenen Speicherbereichs die Laenge ab und weisst dem zu allozieenden Arraypointer eine Adresse 4 bytes weiter zu. (Mal abgesehen davon das ich mir auch nochmal extra die Laenge merke) Das bringt natuerlich alles durcheinander. Und im Callstack ist auch nirgendwo zu sehen, wo das ganze passiert. Ist das Standardverhalten oder was? Wo kann man nachlesen wie das Verhalten genau sein soll/ist.

ShadowXX
2011-06-25, 15:12:56
mein Visual 2010 legt am Anfang des (von mir) vergebenen Speicherbereichs die Laenge ab und weisst dem zu allozieenden Arraypointer eine Adresse 4 bytes weiter zu. (Mal abgesehen davon das ich mir auch nochmal extra die Laenge merke) Das bringt natuerlich alles durcheinander. Und im Callstack ist auch nirgendwo zu sehen, wo das ganze passiert. Ist das Standardverhalten oder was? Wo kann man nachlesen wie das Verhalten genau sein soll/ist.
Gehts um das "4 Byte weiter"? Falls ja, das liegt am Alignment.
Das kannst du aber auch auf 1 Byte ändern in den Projekteinstellungen.

Gnafoo
2011-06-25, 15:13:05
Eventuell hilft dir Seite 451 im Standard weiter, insbesondere die Fußnote:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3126.pdf

It is not the direct responsibility of operator new[](std::size_t) or operator delete[](void*) to note the repetition count or element size of the array. Those operations are performed elsewhere in the array new and delete expressions. The array new expression, may, however, increase the size argument to operator new[](std::size_t) to obtain space to store supplemental information.


Das Verhalten scheint also durchaus durch den Standard abgedeckt zu sein.

Gnafoo
2011-06-25, 15:16:38
Gehts um das "4 Byte weiter"? Falls ja, das liegt am Alignment.
Das kannst du aber auch auf 1 Byte ändern in den Projekteinstellungen.

Soweit ich weiß muss der überladene new-operator sich selbst um das richtige Alignment kümmern.

del_4901
2011-06-25, 16:01:31
Soweit ich weiß muss der überladene new-operator sich selbst um das richtige Alignment kümmern.
Naja wenn einem drumherum noch Daten anglegt werden kann man sich noch so doll um das alignment kuemmern und landet dann doch wieder bei Compilerspezifischen Loesungen.

Weiss jemand wie der GCC das handelt?
Visual Studio 2010 packt einem einen size_t vorn mit dran.

Gnafoo
2011-06-25, 16:29:58
Ich denke mal, dass die zusätzlichen Daten so hinzugefügt werden, dass der letztlich zurückgegebene Speicherbereich auch wieder aligned ist.

Inwiefern bringt das Ganze denn dein Konzept durcheinander bzw. warum musst du dir überhaupt Gedanken darüber machen, wie der Compiler die Daten in deinem Datenblock abspeichert? new/delete sollten doch eigentlich nur Datenblöcke allozieren und freigeben und haben mit deren Inhalt nichts zu schaffen.

Krishty
2011-06-29, 09:46:35
Afaik hast du in C++ keine garantierte Ausrichtung so lange du den Speicherblock nicht manuell allokierst, die Adressen manuell ausrechnest und dann ein placement new darauf ausführst.

Es scheint auch mit C++0x nicht (http://zfx.info/viewtopic.php?f=9&t=307&p=18205#p18211) besser (http://zfx.info/viewtopic.php?f=9&t=307&start=690#p18244) zu werden, aber ich hatte leider nie die Energie, mich tief genug durch den Standard zu wühlen um es mit Sicherheit sagen zu können.

Wiedemauchsei: So lange C++0x’ new-Semantiken noch nicht da sind, und wenn dir die automatische Zusatzinformation um das Array zu viel ist, kommst du um placment new sowieso nicht herum.

Gruß, Ky