普通节省空间的方法

struct A{char name;int age;short sex;
};
int main()
{printf("%d\n", sizeof(struct A));return 0;
}打印结果:
12

字节对齐
1.按最大类型字节数分配空间,比如A中最大为int类型,所以按4字节对齐。
2.先给name分配4个字节的空间,name占一个字节剩余3字节
3.age为int类型占4个字节,上述剩余3个字节不够存放,所以再分配4个字节的空间,给age,占4剩0
4.sex为short类型占2字节,上述剩余0字节不够存放,所以再分配4个字节的空间,给sex,占2剩2
5.总共分配了12个字节,所以sizeof(struct A)==12

注意:32位系统下最大分配4字节。若有double类型,按4字节分配两次,最终还是4字节对齐。64位系统有double则按照8字节分配。

普通策略节省空间
可以看到上述结构体 A 占12字节,若改为以下写法,可优化至8字节。

struct A{int age;short sex;char name;
};

分析
1.首先找最大类型 为int 4字节对齐。
2.给age分配4字节空间,占4剩0
3.上述剩余空间不够存储sex,所以再分配4字节给sex,占2剩2
4.上述剩余空间够name存放,剩余2字节,name占1剩1
5.所以总共分配了8字节的空间 sizeof(struct A)==8

可以看到按类型大小从大到小存放,可以有效解决资源浪费。

位域(段域)

struct A{int age : 8;short sex : 1;char : 0; //空域,表示当前字节剩余7位用0填充表示不用,//解决name跨字节存储的问题char name;
}

如上例:一般人的年龄不可能大于256岁所以,8位足够存储一个人的年龄信息。性别只需要1位(0表示男1表示女)。如此优化后sizeof(struct A)==4

分析:
1.此时age只占8比特位,也就是一个字节,但是需要按结构体中最大类型来分配,所以给age分配4个字节,但是age只占1个字节,剩余3个字节也就是24位。
2.上述剩余字节足够存储sex,占1位剩余23位。
3.上述剩余空间足够存储name,占8位此时当前字节剩余7位再存8位name将跨越两个字节,是不允许的,所以使用空域,再将下一字节分配给name,所以总共剩余8位。
4.所以总共分配了4个字节,达到了最大化的空间节省

注意
1.使用位域不能输入值,必须在初始化时就指定具体值。

结构体如何节省空间——位域(段域)相关推荐

  1. 结构体计算大小与位域计算大小

    结构体的大小计算 原则一:结构体的元素按顺序存储,结构体成员的偏移量必须是成员大小的整数倍 原则二:结构体大小是所有成员大小的整数倍(除了内部结构体和数组) 看例子比较快理解,以下是自己的理解 指针的 ...

  2. c语言给结构体指针申请空间,结构体中的指针变量申请空间问题

    本人声明了一个结构体包含id,age,name三个属性 struct studentInfo { int id; int age; char *name[20]; }; 本人又创建了一个双向循环链表, ...

  3. 将结构体数据存储到一段字符串string中

    核心思想 指定一段内存空间存储结构体数据,然后使用一个指针强制类型转化为结构体类型的,就可以使用这个指针操作结构体相关的成员函数和变量 结构体内存只会为定义的变量进行分配内存空间,函数只进行调用,不占 ...

  4. C语言计算出结构体所占空间大小

    第一次写博客,而且是一个小萌新,有什么错误的地方请各位大佬及时提出来,我会立即更改,最后希望这篇文章能对你有帮助 大家对用struct关键字创建一个结构体应该不陌生,但是我们创建的结构体的空间大小怎么 ...

  5. linux结构体数组的定义数组,task_struct结构体中的run_list和array域

    他们的定义分别是: struct list_head run_list; prio_array_t *array; 其中,想必struct list_head这个结构体大家很熟悉了 struct li ...

  6. 结构体、位段(位域)详解

    结构体大小前边简单介绍了一下,现在对计算结构体的大小进行详细的解释,希望能帮助大家更好的理解结构体和位段. 举个例子: struct {double a;//8 8 8 0-7 char b;//1 ...

  7. 失落的C语言结构体封装艺术

    目录 1. 谁该阅读这篇文章 2. 我为什么写这篇文章 3.对齐要求 4.填充 5.结构体对齐及填充 6.结构体重排序 7.难以处理的标量的情况 8.可读性和缓存局部性 9.其他封装的技术 10.工具 ...

  8. 程序设计基石与实践系列之失落的C语言结构体封装艺术

    英文来源于 Eric S. Raymond-- The Lost Art of C Structure Packing 谁该阅读这篇文章 本文是关于削减C语言程序内存占用空间的一项技术--为了减小内存 ...

  9. C 语言编程 — 高级数据类型 — 结构体与位域

    目录 文章目录 目录 前文列表 结构体 定义结构体 初始化结构体变量 访问结构体成员 结构体的内存分布 将结构体作为实参传入函数 指向结构体变量的指针 位域 定义位域 使用位域结构体的成员 前文列表 ...

最新文章

  1. Linux下C++开发工具介绍
  2. android startactivity 跳到锁屏_「瀑布屏」手机到底好不好用?
  3. 网络001 交换机基本配置
  4. C语言中printf是不是关键字,C语言中printf是什么意思
  5. 【opencv】6.视频编码格式与封装格式
  6. 判断一个程序员水平高低的标准?
  7. 02ODBC基本概念
  8. Solaris下怎样改动文件创建时间及查询
  9. 钱准备好了吗?中国移动将在10月公布5G套餐资费
  10. 计算机rank函数怎么用积分排名,excelrank函数积分排名
  11. 让cp显示进度的脚本
  12. How Google Tests Software.pdf
  13. 关于AMS117_3.3V电源芯片导致CH340串口芯片重启的问题
  14. php开发h5游戏教程,HTML5实现魔方游戏的代码
  15. 小白学习cartopy气象画地图的第二天(中国区域,陆地温度分布图)
  16. Android IPC —— AIDL的原理
  17. mysql重装系统后以前的数据_重装系统后 如何使用之前mysql数据
  18. 制作分页工具类,实现分页操作JSP+Servlet+数据库
  19. 汽车嵌入式软件自动化测试的方法及推荐工具
  20. C语言之strncpy函数

热门文章

  1. sklearn库介绍
  2. JAVA 一个桶里面有白球. 黑球各 100 个
  3. 42种塑料质感Photoshop笔刷
  4. 充值系列——充值系统安全问题(四)
  5. Cocos2d-x3.0 Json解析
  6. MySQL索引(B树、B+树)
  7. C#中DllImport用法和路径问题
  8. Windows phone 应用开发[1]-Text To Speech
  9. serverlet 区别_浅谈JSP serverlet的区别与联系
  10. 为呼吸负责,空气净化器的变革之道