Das Problem hierbei ist, dass das Feld y
16-Bit-ausgerichtet ist. Dein Speicherlayout ist also tatsächlich
Beachten Sie, dass das Tauschen der Reihenfolge von x
und y
nicht hilft, weil das Speicherlayout von Rust für Strukturen tatsächlich undefiniert ist (und somit immer noch 32 Bits, aber ohne Einfachheit, im Compiler). Wenn Sie davon abhängen, erhalten Sie undefiniertes Verhalten.
Die Gründe für die Ausrichtung werden in Zweck der Speicherausrichtung erläutert.
Sie können die Ausrichtung verhindern, indem Sie das Attribut repr(packed)
zu Ihrer Struktur hinzufügen, aber Sie verlieren Leistung und die Fähigkeit, Referenzen auf Felder zu nehmen:
Der beste Weg wäre, transmute
überhaupt nicht zu verwenden, sondern die Werte manuell zu extrahieren und zu hoffen, dass der Optimierer es schnell macht:
Eine Kiste wie die Byteorder kann den Leseprozess verschiedener Größen und Endianess aus den Bytes vereinfachen.
Tags und Links rust