linux 查看内存结构体,浅谈结构体及Linux下内存分配原则

本文介绍了结构体在处理复杂问题和大量数据时的重要性,特别是在网络、内核和驱动等领域的应用。通过示例详细解释了结构体的定义和初始化,并探讨了位域操作如何节省内存空间。同时,文章讨论了Linux环境下结构体内存分配的细节,包括位域限制和内存对齐的规则,展示了位域操作带来的内存优化效果。
摘要由CSDN通过智能技术生成

51Testing软件测试网p[W_!h c

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

结构体定义:51Testing软件测试网2\9rs*Tbj ~struct a{51Testing软件测试网 u-N"Y1j en:W5S

int xx:4;

QD1h4n3}Jh0 int yy:4;51Testing软件测试网2V.YF/dj&l

};51Testing软件测试网@9{2?2c$j

结构体初始化:51Testing软件测试网of&MO{@&Wl

d

mz*sK_0方式一:5].|^

}}n2\_g0struct a aa ={51Testing软件测试网?BBT(pl{

xx:2,

l7S-m-Fq5\1`BI0 yy:351Testing软件测试网$n@[:G8d6d

};51Testing软件测试网#{pe#l#g/@

方式二:RMQx2Yb{7J K0struct a cc ={

+U5c(^&}.Cc+Hn0 .xx=6,51Testing软件测试网-Z.b%a&[,q

.yy=1,51Testing软件测试网GARge,A/h

};

$S+im9N5Ki+A0方式三:$J8Uc7X@q Z0struct a dd={4,2};

s4?x&GR*z0在定义中,可以限制变量的位的作用域,比如上面的:int

xx:4;这表明xx的有效域只有4位,也就是能给他赋值的最大值为15,如果超过这个值,编译器就会报错:warning: overflow in

implicit constant conversion。oM)ZPKRGe.V0

7I0s:D|-I2c0在这里如果你给xx赋值为15,如:51Testing软件测试网7a;ar!NI

Dy&VlNstruct a cc ={51Testing软件测试网3R+^4?VsmYd

.xx=15,

)K~xJ_;l te;~C0 .yy=1,51Testing软件测试网(Fwu0S9[(a#s

};

&N(?KpO,N%h"p0然后输出:9OnTWF#Y]0printf("cc.xx = %d\n",cc.xx);

O~g5m2^V#v0结果会是:-151Testing软件测试网y!c3Z.w"QWX,t51Testing软件测试网2CUab'{G3KEM%h h

因为这里定义的xx为int 型,15的二进制位1111,最高位为1,表示为负数,所以取反加1后为0001。所以是-1。6iW5yP

F%hT0

4^*Eu$h?X0这种位域操作的好处是当你不需要用到你定义的类型的长度时,可以加位域操作以节省内存空间。51Testing软件测试网$ip![W'T:Bk

f&d4\'C+G5[N'p0引出的其他问题UgQQ3Hr051Testing软件测试网9?/Te,D'iBr#K

这里用sizeof(struct

a)得到的是4,如果不加位域限制则是8,至于为什么是4呢?4bit+4bit应该刚好是1byte啊,应该是1才对啊。这是因为我是在linux下编

译执行的,而在linux对内存分配最小值为类型值的一半。(我在linux下做了实验)如下我定义了一个结构体:I*m2Vc!l&oZC0struct a{51Testing软件测试网-c'E*]9g$D9Y2oZ/X

short int xx:2;51Testing软件测试网,X"p1\oTG#|q

short int yy:2;51Testing软件测试网:SLtKi y7^(Rh

}bb;

^"F)sDM\0如上,我定义二个short int类型值,short int在32位linux下为2字节,这里二个相加不足一字节,但是输出sizeof(struct a)的值为2。不足一字节系统自动补满一字节。4N,l%vs?Y7p2i1f0struct a{51Testing软件测试网Y/Cq\9H

short int xx:9;51Testing软件测试网"|*rU1j

cR

short int yy:2;

U8})vR;Yw+pu0}bb;

$@P}e mB$d*wm0这个输出也是2。xx超过一字节,但是9+2=11,还没有超过16(2字节),我猜系统将xx超过的那1bit分到了yy那1bit里面了。51Testing软件测试网IB5@&l'CkoJstruct a{

H5~4Z)XyR4~]0 short int xx:9;51Testing软件测试网

B%wb| B_m!Zxh+B

short int yy:9;

0l[4Un;U]XS0}bb;

w"~"{)Em6d0这个输出是4。9+9=18,超过了16,系统各分配了2字节给xx和yy。51Testing软件测试网+d4H

F){nvi'A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值