2015-07-05 12 views
6

lese ich docs auf DirectXMath und stolperte beim nächsten Durchgang Shared_ptr stören pImpl idiom. Wenn Sie sicherstellen, Ihre Impl-Klasse ist über __aligned_malloc intern ausgerichtet, können Sie frei dann ausgerichtet Typen innerhalb der internen Implementierung verwenden. Diese ist eine gute Option, wenn die 'public' Klasse eine Windows Runtime ref Klasse oder für die Verwendung mit std :: shared_ptr <> vorgesehen ist, die andernfalls die sorgfältige Ausrichtung stören kann.Wie kann Ausrichtung

Ich verstehe nicht, wie shared_ptr jede Änderung in der Ausrichtungsstrategie tun kann, es hat nur einen Zeiger, es weist kein Objekt zu.

+0

Ich stimme zu. Es scheint mir, dass die Dokumente veraltet sind. In C++ 11 können Sie die Ausrichtung Ihres Datentyps über Attribute festlegen. –

Antwort

10

Sie haben Recht, std::shared_ptr wirkt sich nicht auf die Ausrichtung aus. Es nimmt nur einen Zeiger auf ein bereits zugeordnetes Objekt auf. Wenn diese Zuweisung zu einem falsch ausgerichteten Objekt geführt hat, liegt das Problem nicht bei std::shared_ptr, sondern bei dieser Zuweisung.

Aber std::shared_ptr wird oft mit std::make_shared verwendet. std::make_shared<T> führt eine einzelne Zuweisung durch, um sowohl für die std::shared_ptr Kontrollstruktur als auch die T Instanz Speicher zu reservieren. Diese Zuordnung erfolgt nicht mit einer klassenspezifischen operator new (und sollte nicht sein). Wenn das klassenspezifische operator new eine strengere Ausrichtung als das, was der Standardzuordner ausführt, festlegt, ist es einfach zu sehen, wie dies fehlschlagen kann, wenn der Standardzuordner verwendet wird.

+1

Auch wenn der '' operator new'' eine 16-Byte-Ausrichtung verwendet (wie bei x64 native), benötigt der Standard nicht den zusätzlichen Platz, der mit '' std :: make_shared'' der Ausrichtung der Klasse zugeordnet ist selbst. –

+0

Ich brauchte tausend Stunden Debugging, um endlich den Schuldigen zu finden. Vielen Dank! – rwols