简单解析C语言结构体
来源:互联网 发布:软件项目维护费用 编辑:程序博客网 时间:2024/05/18 19:22
1.结构体的定义
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。在C语言中,结构体指的是一种数据结构。
声明一个结构体类型的一般形式如下:
struct 结构体名 { 成员表列 } ;
具体声明如下所示:
struct Struct{ int num; //学号为整型` char name[20]; //姓名为字符串 char sex; //性别为字符型 int age; //年龄为整型 float score; //成绩为实型 char addr[30]; //地址为字符串}; //注意最后一个有分号
注意:结构体类型的名字是又一个关键字struct和结构体名组合而成的(例如struct Student)。结构体名由用户指定的。
说明:
(1)结构体类型并非一种,而是可以设计出多种,例如struct Teach等,各自包含不同的成员。
(2)成员可以属于另一个结构体类
*定义结构体类型变量:*
(1)先声明界结构体的类型,再定义该变量的类型
struct Student(结构体类型名)
student1,student**2(结构体变量名)
(2)在声明类型的同时定义变量
struct 结构体名{ 成员表列} 变量名表列;
(3) 不指定类型名而直接定义结构体类型变量
struct{ 成员表列} 变量名表列;
2 结构体总大小
我们在计算结构体的总大小的时候依据对齐原则。
a.对齐原则
(1)结构体的第一个成员永远放在0偏移处
(2)从第二个成员开始都要对齐到某个对齐数的整数倍处(对齐数为结构成员自身大小和默认对齐数的较小值。在vs平台上默认对齐数为8,在linux上默认对齐数为4)
注:默认对齐数可以被修改,利用 #pragma pack(修改后的字节数),就可以对当前平台的对齐数进行修改。
(3)结构体的总大小必须是默认对齐数的整数倍
(4)如果镶嵌了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
举例如下:
struct S{ // 对齐数 char c1; // 1(自身大小为1,默认对齐数为8,取较小值 从0偏移处开始 int a; // 4(自身4,默认8,取4) 从4偏移处开始算起 double d; // 8(自身8,默认8,取8) 从8偏移处开始算起 char c2; // 1(自身1,默认8,取1) 从16偏移处开始算起};//结构体总大小为24
分析:
由此可见对齐有点浪费空间,那么为是么还要对齐嘞?这就有以下两个方面的原因了
b 对齐原因
1 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的,某些平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2 性能原因:数据结构(尤其是栈)应该尽可能的在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要做两次内存访问;而对齐的内存访问仅需要一次访问。
这次就先简单写到这,分析介绍的比较浅,下次会继续努力,加油。fighting !
- 简单解析C语言结构体
- 【C语言】C语言结构体解析
- 解析C语言结构体
- C语言结构体解析
- 解析C语言结构体,位段
- 解析C语言结构体,位段。
- 解析C语言结构体,位段
- 解析C语言结构体、位段
- 解析C语言结构体,位段
- 解析C语言结构体,位段
- C语言的结构体简单讲解
- C语言结构体简单应用范例
- 深入解析JNA—模拟C语言结构体
- 深入解析JNA—模拟C语言结构体
- 解析C语言结构体对齐(内存对齐问题)
- C语言结构体占用空间内存大小解析
- 解析C语言结构体对齐(内存对齐问题)
- 解析C语言结构体对齐(内存对齐问题)
- 该如何向你奶奶解释企业级架构
- 一个清理隐藏、创建、删除畸形目录、特殊文件名的方法
- Linux命令-cp
- 2017-7-10记录一个故障问题
- 如何在Mac和Linux上装Nodejs
- 简单解析C语言结构体
- maven 常用插件 jdk版本指定,自定义jar包生成源码文件
- SLAM学习——相机与图像
- LuaView:基于Lua的移动端跨平台动态化方案
- 在Oracle中创建表空间和用户
- 概率统计与机器学习:常见分布性质总结
- 实践项目四:桌面版python 查询天气(3)
- 0E-8是什么鬼?
- 选择排序