结构体、共用体

  • 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;

其调用方法与结构体类似。
注意:

共用体占用的内存应足够存储共用体中最大的成员。

共用体大小

类似于跳远,共用体大小采取内存最大的成员变量