den folgenden Code Angenommen:reinterpret_cast auf nicht ausgerichtete Speicher
struct A
{
int a;
int b;
};
char* buffer = receivedFromSomeWhere();
A a = *reinterpret_cast<A*>(buffer + 1);
Wenn buffer + 0
auf der Größe eines int
ausgerichtet sind, wird buffer + 1
am wahrscheinlichsten auf einer nicht ausgerichteten Speicher sein. Der Standardkopiekonstruktor kopiert wahrscheinlich die zwei nicht ausgerichteten int-Member a
und b
. Auf einer x86/x64-Architektur, außer von der Verlangsamung des Codes, wird es die Kopie Konstruktion von a
in irgendeiner unangenehmen Weise beeinflussen?
Ich weiß, dass eine gute Serialisierung das unaligned Speicherproblem lösen würde (durch vielleicht eine Polsterung irgendwo um fügen hinzu, dass die A
Struktur wird in den buffer
ausgerichtet werden), aber in meinem Fall, ich bin nicht verantwortlich für diesen Teil.
Die Tatsache, dass es nicht ausgerichtet ist, wird wahrscheinlich nicht auf dieser Architektur von Bedeutung sein. Es ist jedoch ein undefiniertes Verhalten beim Zugriff auf Speicher mit einem Zeiger auf einen anderen Typ als die Daten mit gespeichert (mit einigen Ausnahmen) (Siehe String-Aliasing) so obwohl es gut auf Ihrer Plattform/Compiler funktioniert es ist undefined Verhalten so unportable bestenfalls – jcoder
Verwenden Sie einfach "memcpy". – GManNickG
Ich glaube nicht, dass es sogar auf x86 verlangsamt, es sei denn, Sie überschreiten eine Cache-Zeilengrenze. –