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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 00:49 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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