C语言中的位段 *** 作—嵌入式学习(实习篇)

C语言中的位段 *** 作—嵌入式学习(实习篇),第1张

记录实习期间学到的新的知识。

malloc申请内存:当申请小内存的时,malloc使用sbrk分配内存;当申请大内存时,使用mmap函数申请内存;但是这只是分配了虚拟内存,还没有映射到物理内存,当访问申请的内存时,才会因为缺页异常,内核分配物理内存。

  1. 若分配内存小于 128k ,调用 sbrk() ,将堆顶指针向高地址移动,获得新的虚存空间。
  2. 若分配内存大于 128k ,调用 mmap() ,在文件映射区域中分配匿名虚存空间。
一、位段的用法

在嵌入式的学习中经常会遇到选择数据类型的苦恼,比如要节省内存、定义网络传输的数据帧格式。使用位段 *** 作可以更加简洁方便的解决上面两个问题,这里记录一下我的学习笔记。

位段 *** 作和字节对齐都可以节省内存,比如一个数据可以利用6位就满足了,但是现有的数据类型只有short数据类型,这样就会浪费掉两个位的存储。

定义三个判断类型的数据,一个可以表示大小在20以内数据和一个可以表示大小在400以内的数据。

三个判断数据:f1、f2、f3,利用一位就可以存储。

表示15以内的数:A1,利用四位就可以表示。

表示一个400以内的数:B1,需要9位可以表示。

利用结构体来表示位段 *** 作具体 *** 作如下:

struct packed_struct
{
    unsigned int f1 :1;
    unsigned int f2 :1;
    unsigned int f3 :1;
    unsigned int A1 :4;
    unsigned int B1 :9;
};

这样的话我们仅使用了两个字节大小就存储了上面五种数据。

使用时利用上述结构体创建一个数据:packed_struct  packed_data; 给成员赋值则直接packed_data.A1=7;即使赋值的大小超出范围,只会取到他的低四位。

二、特殊情况
struct bits
{
    unsigned int f1:1;
    int     word;
    unsigned int f2:1;
};

对应的图就是 :

可以看到和字节对齐的问题一样,结构体的成员顺序不同,占用的内存大小也不同,好的顺序也可以节省内存。 

当然也可以跳过几个位,使用无名位段直接跳过中间几位。

struct x
{
    unsigned int type :4;
    unsigned int :3;
    unsigned int count :9;
};

对应字节分布图: 

可以看到中间位段被忽略。 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1296058.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存