<struct、union、enum>差异
2015-09-01 21:49
399 查看
关于C++和C的区别
区别最大的是struct,C++中的struct几乎和class一样了,可以有成员函数,而C中的struct只能包含成员变量。 enum,union没区别。struct的定义
struct 结构标签 { 类型1 标识符1; 类型2 标识符2; 类型3 标识符3; 类型4 标识符4; 类型5 标识符5; };
1、建议将struct的声明和变量的定义分开写,
2、struct内可以放任何类型的变量声明。
对齐原则
1、数据成员对齐规则。每个数据成员存储的起始位置要从该成员大小的整数倍开始。2、数据成员包含结构体:结构体成员要从其内部最大元素大小的整数倍地址开始存储。
3、结构体的总大小:是其内部最大基本成员的整数倍,不足的要补齐。
union的定义
union 联合标签 { 类型1 标识符1; 类型2 标识符2; 类型3 标识符3; 类型4 标识符4; 类型5 标识符5; };
联合体与结构体的区别
1、结构体中,每个变量依次存储。2、联合体中,每个变量都是从偏移地址零开始存储,每次只有一个成员存储于该地址。
enum的定义
enum 枚举标签 { small, media =7, large =10, humungous };
1、枚举通过简单的操作将一串名字和一串整型值相联系起来。
2、缺省情况下,枚举从零开始,如果对列表中的某一个标识符赋值,下一个标识符值比前面一个的值大1.
3、#define 定义的值在编译时候消失,但是枚举定义的,则在调试的过程任然是可见的,可以在代码调试中使用它们。
其实 enum可以相对应define来使用。
举个例子:
union a { int b; char c; }; a abc; abc.b=4; abc.c=5;
//或者也可以直接在定义时定义变量
union a { int b; char c; }abc; abc.b=4; abc.c=5;
或者:
typedef union { int b; char c; }a; a abc; abc.b=4; abc.c=5;
大小
struct的最终大小考虑是最大的那个类型的倍数和每个都要对齐;enum的大小考虑是最大的那个;
enum是枚举,就是某个变量的值是能够列举的,比如,星期的话就每周1到7,月的话就1到12;
而struct的话是对于某个变量是有很多数据类型构成一个总体的,比如学生这个变量,他需要学号,姓名,年龄,性别等等,这个时候就需要定义结构体了。
而uninon的话呢,其中定义的变量都只占一同块内存,对于联合体:考虑是里面所有类型数据占用空间的倍数同时还要比最大的那个还要大的最小数,就是联合体占用的空间,注意数组类型的处理!
typedef enum { ANUnknown = 0, ANShapeFile = 1, ANSDEDatabase = 2, ANFileDatabase = 3, ANRasterFile = 4 }ANDataType;
sizeof(ANDataType) = 4
struct AAA { double d; char ss; char s; };
sizeof(AAA) = 16
结果 = 结构中长度最大的变量的倍数(遵循内存对齐的原则),如上,double 的长度为 8, 则整个为 8*2 = 16, 因为 char 长度为1,两个char 为2,仍小于8,故按8计算,若有9个char变量,则其中 8个char 合计为 8,剩余一个不足8 按 8字节计算。
比如:
struct AAA { double d; char s1; char s2; char s3; char s4; char s5; char s6; char s7; char s8; char s9; };
按结构体中的变量的长度叠加,则大小为 8+(1+1+1+1+1+1+1+1)+1 = 17, 16 < 17 < 24, 则结构体的大小为 24
比如,
struct AAA { double d; char s1; int i; };
按结构体中的变量的长度叠加,则大小为 8+1+4 = 13, 8 < 13 < 16, 则结构体的大小为 16
union AAA { double d; int i; };
联合,则以定义中最大的数据类型的长度为准,此联合的 size 为 8
备注
union 与 struct 的大小与其内部定义的函数无关!相关文章推荐
- 【Spark亚太研究院系列】Spark道路的真正的主人-第一章 构建Spark星团(第五步)(6)
- <struct、union、enum>差异
- mysql高效索引之覆盖索引
- 12.责任链模式(设计模式笔记)
- 链表的基本操作
- Android-本地方法C调用Java中的方法/NDK-JNI开发实例(六)
- 软件开发工具 第一二章总结
- Python 读Dict数据的方法,解决key 不在dict的问题,get()函数,setdefault()函数
- html的表单
- Word Search
- visio流程图软件
- 模拟短信发送按钮
- 【自学基础】IDE(Integrated Development Enviroment)
- C++面试基础题错题集 day one
- Leetcode_DP_Word Break
- visio流程图软件
- Leetcode -- Maximum Subarray
- Python正则表达式指南
- LeetCode3.2(Implement strStr())
- LeetCode之Count Primes