当前位置: 首页 > news >正文

温州建设小学网站九度企业网站推广软件

温州建设小学网站,九度企业网站推广软件,批量优化网站软件,软件技术的了解【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除 背景 接之前 blog 【OS】【Nuttx】【启动】栈…

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

接之前 blog
【OS】【Nuttx】【启动】栈溢出保护:asm 关键字(上)
【OS】【Nuttx】【启动】栈溢出保护:asm 关键字(下)
分析了 asm, __asm__ 和 __asm 等关键字的概念和用法,下面最后再补充下 gcc 相关的关键字细节

gcc 关键字

上篇 blog 【OS】【Nuttx】【启动】栈溢出保护:asm 关键字(下) 提到了关键字类型 c_common_resword
在这里插入图片描述

这里涉及到了位域的知识点,下面来详细分析下

位域

在 C 语言中,使用位域是一种节省内存空间的技术,比较适合结构体中某些字段只需要少量比特位的情况,比如下面这里,rid : 16 表示 rid 字段占用了 16 个 bit 位,disable : 32 表示 disable 字段占用了 32 个 bit 位

在这里插入图片描述
下面来分析下使用位域这种方法的好处:

  • 节省内存:如果一个字段只需要几个 bit 就能表示(比如状态标志、枚举值等),使用完整的 int 类型会浪费很多内存,而使用位域可以让多个字段共享同一个整数类型的存储空间,比如这里的 rid,如果用完整的 int 类型,4 个字节最大值 2147483647,足足有 21 亿个保留关键字 rid,很明显保留关键字用不了这么多(现在连 1000 个都没有),所以使用位域是比较好的选择

有好处就会有坏处,两个比较明显的:

  • 不能取地址:位域成员不能使用 & 运算符取地址
  • 性能代价:访问位域字段可能比普通字段慢,因为需要进行掩码和移位操作

所以总结一下,如果在意内存使用效率或需要精确控制数据布局(比如编译器,操作系统,嵌入式等场景)的底层基础设施,可以使用位域;否则,在一般应用层编程中可以不用它(因为内存很充足,随便用)

另外要补充的是,使用位域并不会节省下结构体对齐的内存,只是将原有的数据类型给缩小了,而结构体对齐要填充的内存还是会存在的,比如下面这个例子(其实就是 gcc 源码的结构体)

// main.c
#include <stdio.h>enum RidType
{RID_TEST_1 = 0U,RID_TEST_2,
};struct ResWordsType {const const char *const word;enum RidType rid : 16;const unsigned int disable : 32;
};int main(void) {printf("%ld\n", sizeof(struct ResWordsType));return 0;
}

在 x86_64 环境上,指针 word 占 8 个字节,枚举类型 rid 使用位域占 2 个字节,disable 占 4 个字节,所以理论上有效内容总共是 8 + 2 + 4 = 14 字节

在 x86_64 环境上编译,终端输入命令并运行,可以看到实际这个结构体占了 16 个字节
在这里插入图片描述

这里面就涉及到结构体对齐的规则:整个结构体的大小必须是其最大成员对齐要求的倍数,这里结构体 ResWordsType 里最大的成员是 word 指针,占 8 个字节,那么结构体就必须按照 8 字节进行对齐,所以有效内容 14 字节还需向上对齐 2 个字节,到 16 字节

可以看到,位域并不能把结构体对齐要填充的字节省下来,那么,如果这里不用位域呢?还是同样的代码,只不过把位域省掉了

// main.c
#include <stdio.h>enum RidType
{RID_TEST_1 = 0U,RID_TEST_2,
};struct ResWordsType {const const char *const word;enum RidType rid;const unsigned int disable;
};int main(void) {printf("%ld\n", sizeof(struct ResWordsType));return 0;
}

在 x86_64 环境上,word 指针占 8 字节,枚举成员 rid 占 4 字节,disable 成员占 4 字节,理论上刚好 16 字节,都不用填充字节了

终端输入编译命令,运行,可以看到确实也是 16 字节
在这里插入图片描述

那么问题来了,刚才说了用位域可以节省内存,但现在用位域和不用位域,占的空间大小一样,那用位域还有什么意义呢?

这个问题,下篇 blog 再解答

http://www.dtcms.com/a/473279.html

相关文章:

  • 手机网站如何推广劳动局免费培训电工
  • 黄山找人做网站郑州代做网站
  • 做网站美工工资多少wordpress 去掉头部栏目
  • 技术支持公司做的网站怎么查用vue做pc端网站好吗
  • 网站备案 更名wordpress 404插件
  • 创世网站建设 优帮云百度帐号申请注册
  • 标杆网站建设自己建设网站不会咋办呀
  • 长椿街网站建设悦然wordpress建站服务
  • 番禺响应式网站建设深圳制作网站培训学校
  • 网站建设加数据库彩票计划网站怎么做
  • 哪些网站做代理网站地图 制作
  • 厦门专业网站建设建站黑龙江省住房和城乡建设部网站
  • 怎么查网站流量wordpress 桌面
  • 小说在线阅读网站怎么做网络营销推广方案案例分析
  • 邵阳做网站建设优秀营销网站设计
  • 本溪 网站建设 做网站建地方门户网站
  • 制作一个网站需要多少小时如何建设本地网站
  • 做网站讯息制作h5的基本流程
  • 河南城乡建设部网站一定要用c 做网站吗
  • wordpress 插件 留言seo推广分析
  • 做家装壁纸的网站宇泽佛山网站建设
  • 创建一个网站的项目体现项目完成速度因素的网架厂家
  • 泰安网站开发公司cms视频系统大全
  • 太原网站优化怎么做网络seo优化公司
  • 网站全屏宽度是多少合适seo基础课程
  • 用手机建网站世界优秀摄影作品网站
  • php模板建站百度做网站续费费用
  • 专业做网站排名的人北京搜索引擎推广服务
  • wordpress适合下载站的主题国外购物网站app
  • php网站开发实例教程简介寮步做网站公司