char-Array als Speicher für neue Platzierung

7

Ist das folgende legale C ++ mit wohldefiniertem Verhalten?

%Vor%

Oder ist das wegen der Überlegungen zum Pointer-Casting / -Ausrichten problematisch?

    
bluescarni 03.01.2011, 08:47
quelle

5 Antworten

12

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%     
GManNickG 03.01.2011, 09:10
quelle
3

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!

    
templatetypedef 03.01.2011 09:11
quelle
2

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.

    
Markus Kull 03.01.2011 09:05
quelle
2

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.

%Vor%     
Ambroz Bizjak 28.07.2012 21:50
quelle
0

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.

%Vor%

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.

    
Jon Purdy 03.01.2011 09:07
quelle

Tags und Links