c++ - memory alignment into structure - alignment size equal to largest member size -
c++ - memory alignment into structure - alignment size equal to largest member size -
i know why must take, alignment size of structure, alignment size equal largest fellow member size structure.
example :
struct mixeddata { char data1; short data2; int data3; char data4; }; if take largest fellow member (int data3), alignment 4 bytes, have do:
struct mixeddata /* after compilation in 32-bit x86 machine */ { char data1; /* 1 byte */ char padding1[1]; /* 1 byte next 'short' aligned on 2 byte boundary assuming address construction begins number */ short data2; /* 2 bytes */ int data3; /* 4 bytes - largest construction fellow member */ char data4; /* 1 byte */ char padding2[3]; /* 3 bytes create total size of construction 12 bytes */ }; but why don't have, after char data1, char padding1[3] short data2 begins @ adress(data1) + 4 instead of char data1[1]?
and, same logic, why don't have short padding3[1] after short data2?
another question: if on 64 bits processor, should utilize 8 bytes alignement, have set next :
struct mixeddata /* after compilation in 64-bit x86_64 machine */ { char data1; /* 1 byte */ char padding1[7]; /* 7 bytes */ int data3; int padding2[1]/* 4 bytes */ char data4; char padding3[7]; /* 7 bytes create total size of construction 24 bytes */ }; ?
so total size 24 bytes multiple of 8 bytes ?
the overall alignment of construction should of element greatest alignment requirement. required purpose of ensuring that, example, array of structures aligned. if didn't have that, size of struct { int x; char c; }; have first element aligned, next 3 have x unaligned.
it possible convince compiler generate "packed" info construction (with no alignment padding) , utilize packed array, it's bad thought utilize in special cases, because @ best it's slower, @ worst causes execution stop due "unaligned access trap" in processor.
if size of int 4 bytes [it compilers i'm aware of - long either 4 or 8 bytes, depends on compiler], both on 32- , 64-bit (at to the lowest degree x86) 4 byte aligned.
if want have 7 byte "gap" in struct, work:
struct x { char c; uint64_t x; }; which of course of study have:
struct x { char c; char padding[7]; uint64_t x; }; c++ c memory-alignment
Comments
Post a Comment