Ist das folgende legale C ++ mit wohldefiniertem Verhalten?
%Vor%Oder ist das wegen der Überlegungen zum Pointer-Casting / -Ausrichten problematisch?
Ja, das ist problematisch. Sie haben einfach keine Garantie, dass der Speicher richtig ausgerichtet ist.
Es gibt zwar verschiedene Tricks, um Speicher mit der richtigen Ausrichtung zu erhalten, aber am besten nutzt du die aligned_storage
von Boost oder C ++ 0x, die diese Tricks vor dir verbergen.
Dann brauchst du nur:
%Vor%Beachten Sie, dass Sie in C ++ 0x mithilfe von Attributen Folgendes tun können:
%Vor%Wie die Leute hier erwähnt haben, wird dies aufgrund von Ausrichtungsbeschränkungen nicht unbedingt funktionieren. Es gibt verschiedene Möglichkeiten, die Ausrichtung richtig zu gestalten. Erstens, wenn Sie einen C ++ 0x-kompatiblen Compiler haben, können Sie den alignof-Operator verwenden, um zu versuchen, die Ausrichtung zu korrigieren. Zweitens könnten Sie das Zeichen-Array dynamisch zuweisen, da der Speicher von Operator neu garantiert so ausgerichtet ist, dass alles korrekt verwendet werden kann. Drittens könnten Sie versuchen, das Zeichen-Array in einer Union mit einem Typ zu speichern, der die maximal mögliche Ausrichtung auf Ihrem System aufweist. Ich glaube, dass dieser Artikel einige Informationen darüber enthält (obwohl es für C ++ 03 entwickelt wurde und sicherlich nicht so gut ist wie das alignof Operator, der bald herauskommt).
Hoffe, das hilft!
Es ist zumindest problematisch aufgrund der Ausrichtung.
In den meisten Nicht-Intel-Architekturen wird der Code aufgrund falscher Ausrichtung einen "Busfehler" erzeugen oder aufgrund von Prozessor-Traps, die benötigt werden, um den nicht ausgerichteten Speicherzugriff zu beheben, extrem langsam.
Bei der Intel-Architektur ist das normalerweise etwas langsamer als gewöhnlich. Außer wenn einige SSE-Operationen beteiligt sind, kann es auch abstürzen.
Falls jemand Boost oder C ++ 1x vermeiden möchte, funktioniert dieser vollständige Code sowohl in GCC als auch in MSVC. Der MSVC-spezifische Code basiert auf Chromiums aligned_memory.h . Es ist ein wenig komplexer als die GCC-Version, weil MSVCs __declspec(align(.))
nur wörtliche Ausrichtungswerte akzeptiert, und dies wird unter Verwendung der Vorlagenspezialisierung für alle möglichen Ausrichtungen durchgeführt.
Das Array char
ist möglicherweise nicht korrekt für die Größe von myclass
ausgerichtet. Bei manchen Architekturen bedeutet das langsamere Zugriffe, bei anderen bedeutet dies einen Absturz. Anstelle von char
sollten Sie einen Typ verwenden, dessen Ausrichtung gleich oder größer als die von struct
ist, was durch die größte Ausrichtungsanforderung eines beliebigen Elements angegeben wird.
Um genügend Speicher für eine my_class
Instanz zuzuweisen, denke ich, dass size
sizeof(my_class) / sizeof(T)
sein sollte, wobei T
der Typ ist, den Sie für die korrekte Ausrichtung verwenden.
Tags und Links c++ pointers placement-new