浅谈结构体及Linux下内存分配原则

上一篇 / 下一篇  2012-08-07 09:56:18 / 个人分类:Linux

51Testing软件测试网5^%D:o.TQ,LnP

  结构体在程序中的应用是很广泛的,要处理的问题越复杂,数据量越多月杂,就越需要用到结构体。比如网络,内核,驱动等等。熟练使用结构体对每个程序员都是至关重要的。一个好的结构体不仅能使程序体系结构清晰,而且使得操作灵活,可扩展性强。Linux网络之所以很强大,这和它里设计合理的数据结构有很大关系。51Testing软件测试网@ [bb;Fr B

51Testing软件测试网@S9Lr+eYh4a5Z

  结构体定义:

1T\#xsV-O!H/jY0
<SPAN style="FONT-SIZE: 18px">struct a{
Ko6V4l7adA9m0 int xx:4;
3KIA l}Jl0 int yy:4;51Testing软件测试网x7WdtR[!BZ(x
};</SPAN>
51Testing软件测试网QiC [S

  结构体初始化:51Testing软件测试网,Q nE[_ S:X

$Yf+Uyi0  方式一:51Testing软件测试网9`"Qd3Q"_vy

<SPAN style="FONT-SIZE: 18px">struct a aa ={51Testing软件测试网S3Yg1M @)Pk%St
 xx:2,51Testing软件测试网qQ3Z+f_GWaU
 yy:3
/{VA[/k0o0};</SPAN>
51Testing软件测试网 y"n E*qlU!Cj?

  方式二:

&~me,[.Z IJ!MQ0
<SPAN style="FONT-SIZE: 18px">struct a cc ={51Testing软件测试网"i4Zd^t
 .xx=6,
+b s'y dClTRF l0 .yy=1,51Testing软件测试网]VoB2g1B)n
};</SPAN>

-N7at/hH*{8R0  方式三:

;k1fKl zrf2V0
<SPAN style="FONT-SIZE: 18px">struct a dd={4,2};</SPAN>
51Testing软件测试网h,rQ JF1D

   在定义中,可以限制变量的位的作用域,比如上面的:int xx:4;这表明xx的有效域只有4位,也就是能给他赋值的最大值为15,如果超过这个值,编译器就会报错:warning: overflow in implicit constant conversion。51Testing软件测试网U1GTn%AE;X hC;N(y%\

51Testing软件测试网C!YY5a$Ao

  在这里如果你给xx赋值为15,如:

3F0\#Y@u"sW0
<SPAN style="FONT-SIZE: 18px">struct a cc ={
uy&Lss5s0 .xx=15,
Mb W5| W`+{&O0 .yy=1,
)K%T!p.Tp[PBxF0};</SPAN>

6V7@Io^.g1s-|3N0  然后输出:

#_#Lagar;Xa+P0
<SPAN style="FONT-SIZE: 18px">printf("cc.xx = %d\n",cc.xx);</SPAN>

2f"]v Yn;T%D)TC5w0  结果会是:-151Testing软件测试网`rl;`a"p EeD

51Testing软件测试网{2W4tu)p

  因为这里定义的xx为int 型,15的二进制位1111,最高位为1,表示为负数,所以取反加1后为0001。所以是-1。51Testing软件测试网5{a~V/Va/V:T

8J"e1Vg3Eg$CW Y(\0e0  这种位域操作的好处是当你不需要用到你定义的类型的长度时,可以加位域操作以节省内存空间。

1b;U4yav*o:h]0

^[!qYy|0  引出的其他问题

S#y`Tp0

*T/M|.t)Q X$A*Pc0   这里用sizeof(struct a)得到的是4,如果不加位域限制则是8,至于为什么是4呢?4bit+4bit应该刚好是1byte啊,应该是1才对啊。这是因为我是在linux下编 译执行的,而在linux对内存分配最小值为类型值的一半。(我在linux下做了实验)如下我定义了一个结构体:

g#n*\.LG(g0
<SPAN style="FONT-SIZE: 18px">struct a{51Testing软件测试网 L.o5CC8k{Ee;_J#}a)u
 short int xx:2;
A'g%_a Pzs*v2a0 short int yy:2;
wV2lq]Y"]{0n0}bb;</SPAN>

7@E {)Dk0  如上,我定义二个short int类型值,short int在32位linux下为2字节,这里二个相加不足一字节,但是输出sizeof(struct a)的值为2。不足一字节系统自动补满一字节。

o[w g!Y-fV0
<SPAN style="FONT-SIZE: 18px">struct a{
'E0?h:kRtFt2w2M0 short int xx:9;
GH.[+pE|4t'i3g-U0 short int yy:2;51Testing软件测试网 M.mgr M0k&_;FTx;M
}bb;</SPAN>
51Testing软件测试网[:?6hnwrVZ3V

  这个输出也是2。xx超过一字节,但是9+2=11,还没有超过16(2字节),我猜系统将xx超过的那1bit分到了yy那1bit里面了。51Testing软件测试网4Nj*Ob*h` T

<SPAN style="FONT-SIZE: 18px">struct a{
a!wm/gE ~Z0 short int xx:9;51Testing软件测试网,@ D9FE6GUQ
 short int yy:9;
v&G"x3@&w)Z n0}bb;</SPAN>
51Testing软件测试网 v!s EGy#\

  这个输出是4。9+9=18,超过了16,系统各分配了2字节给xx和yy。51Testing软件测试网 [qv _ G'n


TAG:

 

评分:0

我来说两句

Open Toolbar