Cevap vermeden önce size Wiki'den bazı veriler vermek istiyorum
Veri yapısı hizalaması , verilerin bilgisayar belleğinde düzenlenme ve erişilme biçimidir. İki ayrı ancak ilişkili sorundan oluşur: veri hizalama ve veri yapısı doldurma .
Modern bir bilgisayar bir bellek adresinden okuduğunda veya bir bellek adresinden yazdığında, bunu kelime büyüklüğünde yığınlar halinde yapacaktır (örneğin, 32 bitlik bir sistemde 4 baytlık yığınlar). Veri hizalama , verileri kelime boyutunun birkaç katına eşit bir bellek ofsetine koymak anlamına gelir, bu da CPU'nun belleği işleme biçimi nedeniyle sistemin performansını artırır.
Verileri hizalamak için, son veri yapısının sonu ile bir sonrakinin başlangıcı arasına bazı anlamsız baytlar eklemek gerekebilir, bu veri yapısı dolgusudur. .
gcc, yapı dolgusunu devre dışı bırakmak için işlevsellik sağlar. yani, bazı durumlarda bu anlamsız baytlardan kaçınmak için. Aşağıdaki yapıyı düşünün:
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}sSampleStruct;
sizeof(sSampleStruct)
8 yerine 12 olacaktır. Varsayılan olarak, X86'da yapılar 4 bayt hizalamaya doldurulur:
typedef struct
{
char Data1;
//3-Bytes Added here.
int Data2;
unsigned short Data3;
char Data4;
//1-byte Added here.
}sSampleStruct;
__attribute__((packed, aligned(X)))
Belirli (X) boyutlu dolgularda ısrar etmek için kullanabiliriz . X ikinin üsleri olmalıdır. başvurmakBuraya
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}__attribute__((packed, aligned(1))) sSampleStruct;
bu nedenle yukarıda belirtilen gcc özelliği yapı dolgusuna izin vermez. bu nedenle boyut 8 bayt olacaktır.
Tüm yapılar için aynısını yapmak isterseniz, basitçe hizalama değerini kullanarak istiflenebiliriz. #pragma
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)