|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
默认情况下,在32位cpu里,gcc对于结构体的对齐方式是按照四个字节来对齐的。看以下结构体
* J* d& s' m' T' a+ n1 o# d
9 O1 V! _7 T7 U2 [
$ t* N4 y; U; M" h% T# M2 D typedef struct pack{6 A0 j0 C8 a) c. Y! I
6 e9 |1 J/ U) n4 P; @& _
char a;
4 h3 g9 k- F5 p& v$ D) r3 M* V5 y
int b; }2 ~: P* \' ~& ?
$ C3 q) [# O6 a4 s
short c;
( s6 B3 R+ F J/ X, Y8 @( E; ?5 H5 }' C" H, k8 }
}pack;- F! J" z4 U9 \+ K( X7 |, Z
/ r C/ K& i; o 对于Pack结构体,默认情况下在arm/386平台下(别的平台没试过)sizeof(pack)=12,求解过程如下:
( [- I- }7 H! O: l( ?
/ x7 Z$ X0 x8 ]9 O$ T6 a sizeof(char)=1;
& _) H; [2 n# R. F) }5 S/ w) n- R: M; z
下一个int b,由于是四个字节,要求b的开始地址从32的整数倍开始,故需要在a后面填充3个没用的字节,记为dump(3),sizeof(b)=4,此时相当于结构体扩充为
4 E1 G, q' D; {# }" k! Q! Z' N3 o5 L5 _ V2 ]1 X5 S( y- d
char a;
# o K, H* Z& B% U) h3 A$ T7 B( {: i: x: B# c$ A" b
char dump(3);
: V+ x4 Y2 Y1 e7 n% a* H$ z$ |; a
int b;
& ~) ~; z u: _) [: i% ?5 P* b/ @' s+ b3 C4 S5 L7 O' K0 k
看short c,现在c的前面有8个字节,c是两个字节,c的开始地址是从16的整数开始,在b前面不需再加东西.此时对于结构体来说,sizeof(pack)=10,但是这不是最终结果,最后总的字节数也要能被4个字节整除,所以还需在short c后面再加
& a) l& x5 X7 \7 w+ D# x J* s1 O. H$ F; W* O5 m- R
dump(2);
( i8 [/ B; `" S( u# h) r0 o# B9 ? r4 Q0 [( m
故总的字节数为12.) t* ^: A* c- m/ x6 Z+ K
* I# i/ K, B2 k- g0 i/ d
当然以上说的只是简单的情况,下面谈谈arm,x86在gcc里关于内存边界字节对齐的区别.对于同样的结构体,在386下
' g/ H# i2 Y" ^7 v; Y. ^! J, e/ {# T) i R0 b! D/ e; t8 d
#prama pack(1). l d9 V0 R. q
/ l' r y: C g6 q- z 后,sizeof(pack)=1 4 2=7
3 b! W/ ~* o8 ?! c; b. z9 |2 K: e* C0 c; C: b0 ?
而在arm下同样的操作sizeof(pack)=1 4 2 1=8,即虽然b根a之间不要填充但总的长度必须要是4的整数倍.( l" b( B) ^! [2 h
& w% y5 X0 O: j0 I1 C N 在arm 下要使结构体按指定字节对齐,可行的方法
2 X' {+ m @6 r) z, F! t
C1 t/ i. n( _5 i; |2 P 1.在makefile里加-fpack-struct 选项,这样的话对所有的结构按一字节对齐.
; y0 Q1 C* k& p' h. i/ W
7 F- j4 p2 y) S; V/ { 不得不说,确实有那么些质量较差的程序可能需要你部分自然对齐,部分一字 节对齐,此时 O9 b0 q# d/ T" O1 l+ ]
5 O4 p4 B: L5 C5 `8 H' U 2. typedef struct pack{
2 u2 E. I' t8 U% _9 U1 R7 o# r# H% I) h
}__attribute__((packed))1 p6 l" ~0 @9 R" U- w- _
# r' i% P/ c. Z& A0 Y c/ ^3 a: q
可利用__attribute__属性: ^2 R$ a/ [" n" i& e! T1 q3 J
) f" ?4 j M2 d/ h. z a0 n, q 当然最后的方式,还是自己去看arm体系结构与gcc编译选项了。
& P6 i3 ]4 I& B4 K* V, E( r ^' y7 t8 g
|
|