C ++ - Strukturausrichtungsfrage

8

Ich habe eine vordefinierte Struktur (eigentlich mehrere), in der sich Variablen über die 32-Bit-Wortgrenze erstrecken. In Linux (und Windows mit GCC) bin ich in der Lage, meine Strukturen mit 'Attribut ((gepackt))' in die richtige Größe zu packen. Allerdings kann ich es nicht mit VC ++ und #pragma pack auf die gleiche Weise arbeiten.

Unter Verwendung von GCC gibt dies eine korrekte Größe von 6 Bytes zurück:

%Vor%

Bei Verwendung von VC ++ wird eine falsche Größe von 8 Byte zurückgegeben

%Vor%

Ich kann Dinge erledigen, indem ich "troubleMaker" manuell über die Grenze spalte, aber das möchte ich lieber nicht. Irgendwelche Ideen?

    
NJChim 21.09.2009, 16:29
quelle

6 Antworten

17

Verrückte Idee: Schreiben Sie einfach ein C99 oder C ++ 03-konformes Programm an erster Stelle

Ich würde vorschlagen, keine herstellerspezifischen C-Spracherweiterungen zu verwenden, um Geräte- oder Netzwerk-Bit-Formate abzugleichen. Selbst wenn Sie die Felder mithilfe einer Reihe von Spracherweiterungen pro Anbieter ausrichten, müssen Sie sich immer noch um die Byte-Reihenfolge kümmern, und Sie müssen immer noch über ein Strukturlayout verfügen, für das zusätzliche Anweisungen erforderlich sind.

Sie können ein C99-konformes Programm schreiben, das auf jeder Architektur oder jedem Host mit maximaler Geschwindigkeit und Cache-Effizienz arbeitet, indem die standardisierten C-API-String- und Speicherkopiefunktionen und die Posix-Hton- und -Ntoh-Funktionen verwendet werden.

Eine gute Vorgehensweise besteht darin, die folgenden Funktionen zu verwenden, für die es veröffentlichte Standards gibt:

%Vor%

Update: Hier ist ein Code, der überall gleich funktionieren sollte. Möglicherweise müssen Sie <stdint.h> von diesem Projekt herunterladen, wenn Microsoft noch lautet 't es für C99 implementiert, oder einfach die üblichen Annahmen über int-Größen machen.

%Vor%     
DigitalRoss 21.09.2009 16:38
quelle
7

Ausrichtung und Reihenfolge von Bitfeldern sind notorisch implementierungsspezifisch. Es ist viel sicherer, ein normales ganzzahliges Feld zu deklarieren und die "Bitfelder" innerhalb von Masken und bitweisen (| & amp; ^) Operatoren zu manipulieren.

    
Paul Lalonde 21.09.2009 16:42
quelle
2

Ich glaube nicht, dass dieses Verhalten in Visual Studio unterstützt wird. In Abhängigkeit vom Pack-Makro habe ich versucht% ce_de% zu verwenden und habe das gleiche Verhalten. Ich denke, dass Sie mit 12 Bytes festhängen oder Ihre Struktur ein wenig neu ordnen.

    
JaredPar 21.09.2009 16:36
quelle
1

Wenn es definitiv 6 Bytes sein muss, dann definiere es als 3 shorts und hole die Daten selbst raus ... es wird die Dinge nicht verlangsamen ... der Compiler macht das sowieso nur ...

    
Goz 21.09.2009 16:39
quelle
0

Ich glaube, VC ++ unterstützt das nicht, und ich habe ernsthafte Zweifel, ob das Verhalten des GCC in dieser Hinsicht tatsächlich Standard ist.

    
Anton Tykhyy 21.09.2009 16:34
quelle
0

Kürzeres Beispiel mit nur konformem Code

%Vor%     
DigitalRoss 22.09.2009 19:32
quelle

Tags und Links