15 12
发新话题
打印

一个C语言内存对齐的问题

不明白,学习下~~~~~      

TOP

字节对齐

字节对齐5 b9 M% [, f) _% p3 k: g( u
http://hi.baidu.com/zengzhaonong ... fba8dab6fd48d6.html      

TOP

新人 拙见

在linux中以四个字节为开辟单元,即不足四个 开辟四个,多四个的 继续开辟四个 多出的部分 放进另一个四个字节中,5 R! S! q! N* |9 c& L1 V1 [
linux中:
" k) k  x, c5 A" i$ r& estruct
" G( D( @4 L  n{  4 X; K( d7 n$ o& q, z7 \* y5 T
   char a;    //开辟第一个四字节, a占有一个 余三个,留下一个存, int为四个字节 放不下,所以从新开辟四个字节, 因此到此为4个字节.: W  f) c" k* p$ e8 U5 R9 x+ K
   int   b;   //32位机器中  int等同与long int ,所以开辟四个, 到此为4+4=8个字节.
- i9 S, P* a$ s/ Q% @  double c;//开辟两个四字节,所以到此为8+8=16
& o3 c+ k7 I# L4 o4 c   char d;  //开辟四个 ,16+4=20.+ v% ]1 G7 l! z- C$ A+ s
}' b" u" G4 U, i; \/ j# Q5 Q
最后 linux为20字节
0 `: q' a% s! i2 z: W9 y1 u/ a
2 p+ J) Q2 R+ L8 h/ m/ R$ ]window中是以最大单元为开辟单位,即系统先检查结构中最大单位 为double 8个字节,所以以八个字节为单位.
: `' `  C7 V, y5 o9 M5 a9 |' @* G" R' l
struct
4 b. a! P9 O( C. F6 w, S6 V{ / f: ~! i/ U' d$ w8 w
   char a;  //开辟八个字节,a用去一个,继续存放b,c存不下 所以到此为8个字节;8 i' }6 O6 v/ v) i3 }! I
   int    b; // 到此为8个
% f! k. l( y6 _  z* I" g  double c;  //开辟新空间 到此为8+8=16;
, K8 B, n% I3 u7 t$ l' H  char  d;  //上一单元C放满 开辟新八个单元,  最后字节为 16+8=24;* d4 r* Q* t, }* w0 l
}
6 n2 s2 s' r/ \5 [5 X$ b3 i$ r最后windows为24字节      

TOP

以 8 字节对齐
7 i* O* f# F3 C: J: ]struct1 }7 P: |# F1 @9 B7 a2 R. o9 T: m! h
{
) j* P3 N9 A9 Z; L, p* O char a;    1 字节, 对齐补1个字节 共 2字节
) h; j! o( i# a) {- H short  b;  2 字节, 补 4 字节对齐 共 6字节1 `* ^$ j& H  `/ @  `- M/ v+ i
double c; 8 字节 % e3 J$ \- N, n. ]  t& h  U
char d;   1 字节
7 [3 Y. z4 J. p5 L4 W8 O! [. ]/ D};: i8 z4 J) _& Q. V+ t( l' ?
2+6+8 + 1 = 17 , 8 字节对齐, 3*8=246 ~% W# C* C5 n- Q. O; v+ b
所以是 24 字节
) |. b0 w4 e- B: \
; E' j: W( v& y+ @; X第二种
8 V5 _" G* \' r! q; `) o2 rstruct
4 }' s8 i& U/ y: i9 c{5 G- f& a: o' |. n1 w0 C
double c; 8 字节
: Q. a- ]% ?3 u8 [; q char a; 1 字节, 补齐1字节补齐, 共2字节
) R" ~; w% C# [/ U3 i short  b;  2 字节   r' \% G# j1 P8 |& `+ |' v
char d;  1 字节
+ w! ^  [4 O/ V. A0 ]};
0 g) D+ Y* i; u8+2+2+1=13, 2*8=16
5 ^  V0 U+ F6 y( V; {0 t8 O所以是 16 字节      
-----------------------------------------
http://www.darkspy.org/blog

自大的人把宗教当迷信,无知的人把迷信当宗教

TOP

[回复]关于内存对齐的问题

结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
# A( x1 b& x/ V  M$ ~3 J而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值之间,较小的那个进行。      

TOP

 15 12
发新话题