|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
默认情况下,在32位cpu里,gcc对于结构体的对齐方式是按照四个字节来对齐的。看以下结构体) x4 B$ D* N( b1 {8 w
& O6 ? B3 y1 h# o7 j6 V
8 p9 M i; e5 p+ u2 Z0 x k typedef struct pack{) x+ |0 a" e+ M$ p7 l8 l# H
/ [9 r# u( O/ ^1 ^* k' r. E \9 i! c
char a;. t2 V: z* b* a I' G0 k6 a' K
3 [% b& `9 j _: x: P2 ^ int b;+ G' I; V' S* _1 {, n* \5 k) i9 B$ v
" {; D" I& l3 }+ l1 _8 ` short c;( B. l% ^" p9 d/ @" n8 e
, k. K) V( ^3 Q7 p
}pack;
( P- }; b' U& {, k5 U
( H0 ^1 d6 x. C: L" y 对于Pack结构体,默认情况下在arm/386平台下(别的平台没试过)sizeof(pack)=12,求解过程如下:
: z4 {) q" s( o% [2 ~* p4 d5 Y( K) a0 `2 E Q' j N1 e
sizeof(char)=1;
7 P5 o! R, V0 a! e+ u( D( l- o7 H
3 J1 H& f! `" Q# J 下一个int b,由于是四个字节,要求b的开始地址从32的整数倍开始,故需要在a后面填充3个没用的字节,记为dump(3),sizeof(b)=4,此时相当于结构体扩充为6 Z4 {3 z9 h f. Q
$ _1 x3 r' o9 j, z, x char a;! O* K' l+ B: M4 b. v% f
# H' ^8 w0 r" r% G- E: s X
char dump(3); {! s8 C2 K( e5 g' e5 ~0 y2 [' h' o
" v! x6 g/ Y- s$ ]% {+ U
int b;/ c3 Y/ Y, H8 ^, T% ?9 l' k
9 |& p' H3 r4 M& {" I 看short c,现在c的前面有8个字节,c是两个字节,c的开始地址是从16的整数开始,在b前面不需再加东西.此时对于结构体来说,sizeof(pack)=10,但是这不是最终结果,最后总的字节数也要能被4个字节整除,所以还需在short c后面再加
, R1 Q! | C6 ~4 O% c" o8 A" S4 F9 b( |2 H. d3 o
dump(2);' I" ^. N" n l# z7 f
/ z" q7 q$ K1 J( q# c 故总的字节数为12. }$ r2 ?3 r! E! ~! n; X, f
' l5 }% E- u7 y# [* G7 a" f9 @9 t& | 当然以上说的只是简单的情况,下面谈谈arm,x86在gcc里关于内存边界字节对齐的区别.对于同样的结构体,在386下
- ]" D3 Y( Q/ M; V
9 M5 [' h) X) N9 h1 i5 y #prama pack(1)+ i( p, B) `1 @/ z) C' f& S6 h$ f
; x% \' [& X7 _
后,sizeof(pack)=1 4 2=7
2 m+ b2 N" G. d3 N* |. K4 n' n. J
6 s8 o# k2 L8 i0 x9 u8 [ 而在arm下同样的操作sizeof(pack)=1 4 2 1=8,即虽然b根a之间不要填充但总的长度必须要是4的整数倍.
8 ?& y. \" q/ E- P2 I3 K. v2 f- S5 w! ^9 m& d$ }
在arm 下要使结构体按指定字节对齐,可行的方法* I( D- @0 b: @8 M9 C, m; R9 ^ r% r
3 _, D2 R ]& a 1.在makefile里加-fpack-struct 选项,这样的话对所有的结构按一字节对齐.' D/ z' {- K, ?: R+ S- f
+ n2 ~, `& O0 h: u* ]* q
不得不说,确实有那么些质量较差的程序可能需要你部分自然对齐,部分一字 节对齐,此时5 B9 @: ?" u8 ]
& j! y" u2 {+ u
2. typedef struct pack{
3 Y" f2 b) d% m {, x% c% J Q2 ]; t: ?+ X5 r% s% r+ [4 k+ w
}__attribute__((packed)); l4 Z2 n+ d4 v! e$ j% s
6 E# y U; o% x k0 q2 i$ f1 q
可利用__attribute__属性
; q/ ^1 r7 Y: m5 T1 K! }$ H2 t, W& ]1 t @4 h/ F( @4 q
当然最后的方式,还是自己去看arm体系结构与gcc编译选项了。
$ D9 j( A3 s7 X$ ], ~
: N, Q4 R4 V: ]! ^# S- q" Q |
|