Bevorzugtes Idiom für endianess-agnostische Lesevorgänge

8

Im Quellcode von Plan 9 finde ich oft Code wie diesen, um serialisierte Daten aus einem Puffer mit einer wohldefinierten Endlichkeit zu lesen:

%Vor%

Ich habe erwartet, dass sowohl gcc als auch clang diesen Code in etwas so Einfaches wie diese Assembly auf amd64 kompilieren:

%Vor%

Aber im Gegensatz zu meinen Erwartungen erkennen weder gcc noch clang dieses Muster und erzeugen stattdessen eine komplexe Montage mit mehreren Verschiebungen.

Gibt es ein Idiom für diese Art von Operation, das sowohl für alle C99-Implementierungen portierbar ist als auch einen guten (d. h. wie den oben dargestellten) Code über Implementierungen hinweg erzeugt?

    
fuz 09.08.2014, 14:33
quelle

3 Antworten

5

Nach einigen Recherchen fand ich (mit Hilfe der grandiosen Leute in ## c auf Freenode), dass gcc 5.0 Optimierungen für das oben beschriebene Muster implementiert. Tatsächlich kompiliert es die C-Quelle, die in meiner Frage aufgeführt ist, zu der genauen Baugruppe, die ich unten aufgelistet habe.

Ich habe keine ähnlichen Informationen über Clang gefunden, also habe ich einen Fehlerbericht eingereicht.

    
fuz 09.08.2014, 21:05
quelle
1

Wenn Sie eine Konvertierung zwischen einer nativen Plattform-Bestellung und einer definierten Bestellung garantieren möchten (z. B. Bestellung in einem Netzwerk), können Sie Systembibliotheken zur Arbeit geben und einfach die Funktionen von <netinet/in.h> : hton, htons, htonl verwenden und ntoh, ntohs, nthol.

Aber ich muss zugeben, dass die Include-Datei nicht garantiert ist: Unter Windows denke ich, dass es winsock.h ist.

    
Serge Ballesta 09.08.2014 20:59
quelle
-2

Sie können die Endgültigkeit wie in dieser Antwort festlegen. Verwenden Sie dann das Makro O32_HOST_ORDER , um zu entscheiden, ob das Byte-Array direkt in uint32_t umgewandelt werden soll oder ob Sie den bitverschiebenden Ausdruck verwenden möchten.

%Vor%     
Tobias Brandt 09.08.2014 20:37
quelle

Tags und Links