2010-12-29 15 views
5

Ich habe versucht, meinen Kopf um den TR1-Zusatz zu bekommen, der als aligned_storage bekannt ist. Beim Lesen der folgenden Dokumente N2165, N3190 und N2140 kann ich für das Leben von mir nicht eine Aussage sehen, wo es klar beschreibt Stapel oder Haufen Natur des Speichers verwendet wird.Zuweisungsziel von std :: aligned_storage (Stapel oder Heap?)

Ich habe mir die Implementierung von msvc2010, boost und gcc angesehen, die alle eine stackbasierte Lösung bieten, die sich auf die Verwendung einer Union konzentriert.

Kurz:

  • Ist der Speichertyp (Stack oder Heap) von aligned_storage definiert Implementierung verwendet oder ist es immer gemeint basiert stapeln werden?

  • und, was ist das spezifische Dokument, das das definiert/bestimmt?

Anmerkung: In MSVC10, die folgende ist die Definition der Art des aligned_storage, in diesem Fall, wenn die aligned_storage ein Auto-Variable ist die Daten (_VAL, _Pad) auf dem Stapel erstellt werden:

template<class _Ty, size_t _Len> 
union _Align_type 
{ 
    // union with size _Len bytes and alignment of _Ty 
    _Ty _Val; 
    char _Pad[_Len]; 
}; 

Hinweis: Dies ist NICHT eine triviale Frage. Bitte versuchen Sie die Frage zu verstehen, bevor Sie eine Antwort schreiben.

Antwort

12

std::aligned_storage<Len, Align> deklariert einfach ein Mitglied typedef (type).

Das Mitglied typedef type wird ein Teiler ein POD Typ entsprechend der Len und deren Ausrichtung höchstens dessen Größe für jedes Objekt als nicht initialisierte Speicher Gebrauch sein Align

(Diese aus dem aktuellen ist C++ 0x Entwurf, N3225, 20.7.6.6 Tabelle 53, aber die Sprache in der TR1-Spezifikation, N1836, ist effektiv die gleiche, außer dass in C++ 0x der Align Vorlagenparameter als Standardargument den maximalen Ausrichtungswert hat.)

std::aligned_storage reserviert keinen Speicher selbst. Sie können ein Objekt vom Typ std::aligned_storage<Len, Align>::type anlegen und dieses Objekt als Objekt eines beliebigen Typs neu interpretieren, der die oben genannten Anforderungen erfüllt.

+2

Ich bin mir nicht sicher, ob eine Antwort besser werden kann. Was wäre der Punkt, wenn Daten dynamisch in 'type' zugeordnet würden? Wie könnte das bei der Ausrichtung helfen? – icecrime

+2

@Zenikoder - lesen Sie einfach noch einmal das Zitat aus dem Standard. Und wieder, wenn nötig. :) 'std :: aligned_storage <...> :: type definiert einen POD-Typ mit angeforderter Ausrichtung. Sie können Speicher für diesen Typ auf Stapel oder in dem Heap reservieren, es ist nicht relevant. – atzz

+0

@Zenikoder - es ist nicht implementierungsdefiniert. Es ist benutzerdefiniert. Die von James zitierte Aussage erklärt alles klar genug. – atzz

0

Normalerweise müssen Sie keine Objekte auf dem Heap abgleichen, da eine Zuweisung (new/malloc) Speicher an einer Adresse zurückgibt, die auf einen beliebigen Typ ausgerichtet ist.

+3

Das ist nicht ganz richtig. Wenn Sie die SIMD-Anweisung verwenden, müssen Sie manchmal Daten mit 16-Byte-Grenzen ausrichten, während new/malloc keine solche Garantie bietet. Zum Beispiel, libc malloc Rückkehr Speicher auf 8 Bytes Grenze ausgerichtet. Siehe 'posix_memalign' Funktionen unter Linux oder' _aligned_malloc' unter Windows. –

+1

Ich konnte nur mit std :: align, das noch nicht in gcc4.8 ist, ausgerichteten Speicher auf dem Heap zuweisen. Daher verwende ich diese Implementierung: http://code.google.com/p/c-plus/source /browse/src/util.h#57 –

Verwandte Themen