2016-12-06 5 views
2

Der folgende Code:Wie mache ich gcc ignoriert Padding beim Generieren .data Abschnitt?

#include <stdint.h> 

uint8_t byte = 0x12; 
uint16_t word = 0x1234; 

int main(int argc, char *argv[]) 
{ 

     return 0; 
} 

den .data Abschnitt Inspizieren, es zeigt, dass byte Variable 2 Bytes, nicht 1 als uint8_t Versprechen:

Hex dump of section '.data': 
    0x00601020 00000000 00000000 00000000 00000000 ................ 
    0x00601030 12003412       ..4. 

Wie können wir sicherstellen, dass byte 1 Byte ist, auch es macht den Speicher falsch ausgerichtet? Ich habe versucht, #pragam pack(1) hinzuzufügen, aber es ist immer noch dasselbe. Variable 1 ist aber Compiler pads es auf 2 Bytes

+0

Gibt es einen bestimmten Grund, warum Sie das wollen? –

+0

Warum sollten Sie jemals [Stapelausrichtung und -polsterung] deaktivieren (http://stackoverflow.com/questions/1061818/stack-allocation-padding-and-alignment)? –

+0

Weil ich mich wundere, wenn die 'byte' Variable als 2 Bytes verwendet wird, nicht als 1 Byte. Aber es scheint, als ich versucht habe, Byte "-1" zu setzen, hat sich nur ein einzelnes Byte in "ff" geändert. Es scheint, dass 'gcc' sicherstellt, dass die Füllbytes nicht durch den gesamten erzeugten Code verwendet werden. –

Antwort

0

Bytevariablen 2 Bytes, nicht 1 als uint8_t

verspricht. Beachten Sie, dass sich dies nicht auf die gesamte Abschnittsgröße auswirkt (es wird immer noch auf 2 Byte ausgerichtet).

Wie können wir sicherstellen, dass Byte 1 Byte ist, selbst wenn der Speicher nicht richtig ausgerichtet ist?

Warum möchten Sie das tun? Auf vielen Plattformen führt dies dazu, dass der Compiler ineffizienten Code für Speicherzugriffe generiert, so dass Sie alles verlieren, was Sie aufgrund der Erhöhung der Codegröße aus variablen Alignments herausquetschen. Wenn Sie unbedingt nicht ausgerichtete Globals verwenden müssen, markieren Sie sie mit __attribute__((aligned(1))).

Verwandte Themen