结构体、共用体
- 1.结构体
- 基础知识
- 代码基本写法
- 内存对齐
- 2. 共用体
- 引论
- 定义
- 基础写法
- 共用体大小
1.结构体
基础知识
类似于Java中的javaBean,可以将一些变量封装成一些对象。同样的,在C里面可以将一些其他的变量,封装成一个结构体,结构体和共用体表现的含义是一致的
代码基本写法
#include<stdio.h>
struct Student
{
int i;
short j;
}s1,s2;
void main(){
struct Student student;
student.i = 10;
student.i = 5;
s1.i = 10;
s1.j = 3;
printf("结构体大小%d:", sizeof(student));
system("pause");
}
内存对齐
在上述代码中,定义了两个结构体,,在结构体体中,定义了两个变量,一个int类型,一个short类型,int类型是4个字节,short类型是2个字节,按常理,这个结构体是6个字节,但是通过
sizeof(student)
查看,是8个字节,为什么是8个字节呢?这就涉及到C里面的内存对齐概念。在C执行的过程中,特别是给对象,结构体进行分配内存的时候,它是遵循内存对齐的规则。
内存对齐
定义:对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他也就被称为自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那他是自对齐的。结构体大小
定义:当结构体需要内存过大,使用动态内存申请。结构体占用字节数和结构体内字段有关,指针占用内存计算4/8字节,因此传指针比传值效率更高结构体存储原则
(1).结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
(2).结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公数倍看了上面定义,我们可以得知,刚刚我们定义的short类型,short类型是2个字节,由于在32位的CPU下,它最小的单位步长是4个字节,由于2个字节小于4个字节,所以系统会给short分配4个字节,只不过后面两个字节不会起作用,后面还有一个int类型,由于int类型有4个字节,所以这个结构体,一共8个字节。
为什么要基于内存对齐呢?
举个例子,张三要去请李四和王五去他家做客,由于李四和王五住在不同的楼层,所以,张三需要先去李四家邀请李四,再去王五家邀请,需要两次,这就是访问一个地址,它必须要做的两件事情,这就是没有去做实现内存对齐的情况下,那张三能不能只邀请一次呢?
答案是可以的,那就是让李四和王五同时处于一个房间
这个例子可以证明,内存对齐对于访问指针的效率非常重要的。
2. 共用体
引论
共用体和结构体类似,它都是表达一个数据类型的集合,只不过结构体,他需要内存开销更大一点。
定义
共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候都只能有一个成员带有值,共用体提供了一种使用相同的内存位置的有效方法。
基础写法
union Data{
int i;
float f;
char str[20];
} data;
其调用方法与结构体类似。
注意:
共用体占用的内存应足够存储共用体中最大的成员。
共用体大小
类似于跳远,共用体大小采取内存最大的成员变量