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

 我来答
称佑呼宇寰
2020-02-03 · TA获得超过3896个赞
知道大有可为答主
回答量:3172
采纳率:28%
帮助的人:257万
展开全部
浅谈结构体及linux下内存分配原则结构体在程序中的应用是很广泛的,要处理的问题越复杂,数据量越多月杂,就越需要用到结构体。比如网络,内核,驱动等等。熟练使用结构体对每个程序员都是至关重要的。一个好的结构体不仅能使程序体系结构清晰,而且使得操作灵活,可扩展性强。linux网络之所以很强大,这和它里设计合理的数据结构有很大关系。
www.zhishiwu.com
结构体定义:[cpp]<span
style=font-size:18px;>struct
a{
int
xx:4;
int
yy:4;
};</span>
结构体初始化:方式一:[cpp]<span
style=font-size:18px;>struct
a
aa
={
xx:2,
yy:3
};</span>
www.zhishiwu.com
方式二:[cpp]<span
style=font-size:18px;>struct
a
cc
={
.xx=6,
.yy=1,
};</span>
方式三:[cpp]<span
style=font-size:18px;>struct
a
dd={4,2};</span>
在定义中,可以限制变量的位的作用域,比如上面的:int
xx:4;这表明xx的有效域只有4位,也就是能给他赋值的最大值为15,如果超过这个值,编译器就会报错:warning:
overflow
in
implicit
constant
conversion。在这里如果你给xx赋值为15,如:[cpp]<span
style=font-size:18px;>struct
a
cc
={
.xx=15,
.yy=1,
};</span>
www.zhishiwu.com
然后输出:[cpp]<span
style=font-size:18px;>printf(cc.xx
=
%d/n,cc.xx);</span>
结果会是:-1因为这里定义的xx为int
型,15的二进制位1111,最高位为1,表示为负数,所以取反加1后为0001。所以是-1。这种位域操作的好处是当你不需要用到你定义的类型的长度时,可以加位域操作以节省内存空间。引出的其他问题这里用sizeof(struct
a)得到的是4,如果不加位域限制则是8,至于为什么是4呢?4bit+4bit应该刚好是1byte啊,应该是1才对啊。这是因为我是在linux下编译执行的,而在linux对内存分配最小值为类型值的一半。(我在linux下做了实验)如下我定义了一个结构体:[cpp]<span
style=font-size:18px;>struct
a{
short
int
xx:2;
short
int
yy:2;
}bb;</span>
如上,我定义二个short
int类型值,short
int在32位linux下为2字节,这里二个相加不足一字节,但是输出sizeof(struct
a)的值为2。不足一字节系统自动补满一字节。[html]<span
style=font-size:18px;>struct
a{
short
int
xx:9;
short
int
yy:2;
}bb;</span>
www.zhishiwu.com
这个输出也是2。xx超过一字节,但是9+2=11,还没有超过16(2字节),我猜系统将xx超过的那1bit分到了yy那1bit里面了。[cpp]<span
style=font-size:18px;>struct
a{
short
int
xx:9;
short
int
yy:9;
}bb;</span>
这个输出是4。9+9=18,超过了16,系统各分配了2字节给xx和yy。作者
linuxblack125125
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
东莞市友贸实业有限公司_
2023-11-22 广告
第五代双倍数据速率DDR5双列直插式内存模块是一种高速、高性能的内存模块,适用于需要高带宽和低延迟的应用场景。与前几代内存模块相比,DDR5双列直插式内存模块具有更高的数据传输速率和更低的功耗,同时提供了更大的内存容量和更高的可靠性。在数据... 点击进入详情页
本回答由东莞市友贸实业有限公司_提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式