C语言结构体对齐、枚举、宏、联合体
2020-08-30 15:30
1241 查看
C语言结构体对齐、枚举、宏、联合体
结构体对齐问题
关于结构体对齐问题请阅读:结构体对齐规则及举例
系统指定类型的大小与系统有关,这里取
数据类型 | 字节 |
---|---|
char | 1 |
float | 4 |
double | 8 |
long double | 16 |
short int | 2 |
int | 4 |
long int | 8 |
long long int | 8 |
(1)按结构体最大成员对齐(32位机下double、long long按照4字节对齐)
案例一:
struct A{ char a; short b; int a; };
结果是8
案例二:
struct A{ int a; double b; };
结果是12并非16
(2)结构体嵌套
嵌套的结构体会在先内部完成对齐。
案例一:
struct A{ short a; char b; }; struct B{ struct A b; char c; int d; };
结果是12,而非8
如果是:
案例二:
struct A{ short a; char b; char c; int d; };
则是8
(3)每个成员的起始位置必须是当前成员大小的整数倍
例如:
- short的起始位置必须是2的倍数。
- int、long long、double的起始位置必须是4的倍数。
- char则随便放,因为是1。
struct A{ char a; short b; int c; };
b的偏移是2而非1
(4)在使用预编译指令指定对齐方式之后,一切听预编译指令
#pragma pack(nbytes)可以指定按nbytes字节对齐。
枚举常量与宏的区别
- 枚举常量属于常量,但宏不是常量;
- 枚举常量具有类型,但宏没有类型,枚举变量具有与普通变量相同的诸如作用域、值等性质,但宏没有,宏不是语言的一部分,它是一种预处理替换符。枚举类型主要用于限制性输入,例如,某个函数的某参数只接受某种类型中的有限个数值,除此之外的其它数值都不接受,这时候枚举能很好地解决这个问题。能用枚举尽量用枚举,否则在调试的时候你是看不到当时的值的。
- 枚举可以一次定义大量相关的常量,而#define 宏一次只能定义一个。
联合体和结构体区别
两者都可以有多个成员,结构体是多个不同类型变量的组合,其占用的内存大小是所有变量大小的总和; 联合体多个不同类型的变量占用一份存储空间,其占用内存的大小是联合体中最大的那个变量的大小。
由于共用一份存储空间,所以对联合体的成员进行修改会顺带改变其他成员,结构体则不会。
C和C++结构体区别
- C的结构体内不允许有函数成员存在,C++允许有内部成员函数。所以C的结构体是没有构造函数、析构函数、和this指针的。
- C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。
- C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。
- 创建结构体对象的书写不同,C++直接用结构体名 变量名;而C要struct 结构体名 变量名;
- C结构体不可以有static成员。
相关文章推荐
- 【C语言】 C 语言 关键字分析 ( 属性关键字 | 常量关键字 | 结构体关键字 | 联合体关键字 | 枚举关键字 | 命名关键字 | 杂项关键字)
- 结构体struct、枚举enum、联合体union、位字段、自定义类型typedef、字节对齐
- (四)C语言基础(结构体,联合体,枚举,别名)
- C语言基础-结构体和联合体
- C语言结构体的对齐原则
- C语言结构体的字节对齐原则
- C语言学习笔记--------伊能C语言学习笔记------C语言结构体字节对齐机制
- C语言基础(19)-结构体,联合体,枚举和typedef
- C语言基础_02:结构体与联合体
- 结构体的字节对齐(跨语言传参时尤为重要)
- C语言结构体、枚举、联合
- 黑马程序员——C语言基础——结构体、枚举
- 结构体、联合体和位断的内存对齐问题
- struct 结构体 、 union 枚举 及 #pragma pack 字节对齐
- C语言结构体对齐
- #9:C语言复习:结构体与枚举,共用体;
- 初识联合体、结构体中的数据对齐问题
- C语言结构体的字节对齐原则
- C语言结构体的字节对齐原则
- C/C++学习笔记4 结构体联合体枚举