找回密码
 注册
关于网站域名变更的通知
查看: 419|回复: 1
打印 上一主题 下一主题

ARM内存边界对齐以及sizeof问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-10-24 10:48 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
ARM内存边界对齐以及sizeof问题
       默认情况下,在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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 19:35 , Processed in 0.171875 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表