一、结构体
1.1 C结构体和C++的结构体
C++中的结构体是C结构体的扩展,增加了一些新的用法和属性
使用时的区别:
struct Human
{
char name[15];
int age;
};
typedef struct Human human_; C语言中取别名
struct Human tom; C语言中使用
Human tom; C语言别名使用/C++中使用
根本:
C语言中结构体就是不同类型元素的集合,不涉及处理数据的算法
C++中结构体不仅有数据还封装了不同处理数据的方法
1.2 C++结构体和C++的类
- 内部成员的默认权限不同
struct student1 成员默认public属性
{
int age;
};
class student2 成员默认private属性
{
int age;
};
- 继承下默认权限不同
struct human
{
int age;
}
struct student : human 默认public继承属性
{
int Stu_ID;
}
student tom;
tom.age = 19; 在class下会报错,class默认private属性
- 模板的使用
定义一个模板:
template <class T> 或者 template <typename T>,但不能是:struct
1.3 结构体内存对齐
目的:为了提高程序运行的效率,访问没有对齐的内存,CPU需要进行两次,而对齐的内存访问只需要一次
CPU访存的地址必须满足4的整数倍,内存对齐是一种牺牲空间换取效率的方案
对齐规则:
- 首元素不需要对齐
- 其他成员对齐到自身类型整数倍
- 如果指定默认对齐数,则对齐到自身类型和默认对齐数较小值的地址
- 总大小:最大对齐数的整数倍
struct A // 24
{
char a;
double b;
char c;
};
struct B // 12
{
char a;
int b;
char c;
};
struct C // 8
{
char a;
char b;
int c;
};
struct D // 16
{
double a;
char b;
int c;
};
struct E // 32
{
char a;
struct D b;
double c;
};
二、位段
1.1 什么是位段?
- 位段是一种数据的压缩,不考虑效率,注重空间使用率,因此不需要内存对齐
- 位段在TCP/IP报头中使用
struct A
{
char a : 3;
char b : 4;
char c : 5;
char d : 4;
};
int main()
{
A a = { 0 }; // 初始化,防止里面是随机值
a.a = 10;
a.b = 12;
a.c = 3;
a.d = 4;
cout << sizeof(struct A) << endl;
return 0;
}
1.2 位段在TCP/IP协议报头中的使用
struct
{
unsigned int vison : 4;
unsigned int handler lend : 4
unsigned int TOS : 8
unsigned int total length : 16
};
三、联合
联合的成员公用同一块空间,所以联合也叫共用体
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
//计算连个变量的大小
printf("%d\n", sizeof(un));
un.i = 1
if (un.c)
printf("小端\n");
else
printf("大端\n");