前言
结构体是重要的知识点,其中,结构体的内存对齐是较重要的部分(本人使用的编译器是VisualStudio2022,下面介绍的对齐数也是以VS默认的8为标准),对后面学习数据结构有很大的帮助,因为结构体是自定义数据类型,可以在一个集合中处理不同的数据,所以在做题的时候用结构体也会带来极大的灵活性。以下是自己自学这部分知识总结的结构体方面的见解和体会,希望能给各位朋友们带来一点帮助,也希望各位大佬们对本篇文章多多提出自己的意见。
一、结构体是什么
在C语言中,结构体(structure)是一种用户自定义的数据类型,它允许你将不同类型的数据组合在一起,形成一个更复杂的数据类型。结构体在编程中非常有用,特别是当你需要处理由多个相关部分组成的数据时。
1.结构体的声明
结构体的声明使用struct
关键字,后面跟着结构体的名称和成员列表。成员列表用花括号{}
括起来,每个成员都是某种数据类型的一个变量,成员之间用分号;
分隔。下面是一个简单的结构体声明的例子:
struct Person {
char name[10];
int age;
float height;
};
在这个例子中,Person
是一个结构体的名称,它有三个成员:name
(一个字符数组,用于存储名字)、age
(一个整数,表示年龄)和height
(一个浮点数,表示身高)。 其实,结构体的声明就是告诉计算机,我们构建了一个自定义数据类型,叫Person,接着我们就可以和基本数据类型(int,float,char等)一样的使用创建变量了。
2.结构体的初始化
一旦声明了结构体,你就可以创建该类型的变量,并访问或修改其成员。例如:
#include <stdio.h>
// 声明结构体
struct Person {
char name[10];
int age;
float height;
};
int main() {
// 创建一个结构体变量
struct Person person1;
// 初始化结构体成员
strcpy(person1.name, "Alice");
person1.age = 30;
person1.height = 5.5;
// 访问结构体成员
printf("Name: %s\n", person1.name);
printf("Age: %d\n", person1.age);
printf("Height: %.1f\n", person1.height);
return 0;
}
首先,我们声明了一个Person类型,接着 我们用Person创建了一个变量person1,然后我们初始化person1中的三个成员,最后调用并打印它们。
二、结构体的内存对齐
1.对齐规则
1)VS中的默认的值为8
2)Linux中的 gcc 没有默认对齐数,对齐数就是成员自身的大小
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
// 声明结构体
struct Person {
char name[10];
int age;
float height;
};
int main() {
// 创建一个结构体变量
struct Person person1;
int ans = sizeof(person1);
printf("内存大小为:%d", ans);
return 0;
}
对上述的代码,画出该结构体的内存结构图,如下图:
2.为什么存在内存对齐
大部分的参考资料 是这样说的:
1)平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2)性能原因:
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。假设一个处理器总是从内存中取8个字节,则地址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对齐成8的倍数,那么就可以用一个内存操作来读或者写值了。否则,我们可能需要执行两次内存访问,因为对象可能被分成放在两个8字节内存块中。
总体来说:结构体的内存对齐是拿空间来换取时间的做法。所以,在设计结构体的时候,我们既要满足对齐,又要节省空间,就要让占用空间小的成员尽量集中在一起。
3.自定义设置编译器的默认对齐数
用pragma pack()来修改默认对齐数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
#pragma pack(1)
// 声明结构体
struct Person {
char name[10];
int age;
float height;
};
int main() {
// 创建一个结构体变量
struct Person person1;
int ans = sizeof(person1);
printf("内存大小为:%d", ans);
return 0;
}
这里,我们修改默认对齐数为1,成员name[10]的最终对齐数为:1,成员age的最终对齐数为:1,成员height的最终对齐数为:1,所以此时,该结构体的最大对齐数为:1,此时总空间大小是:10+4+4=18
总结
在内存中,结构体这种自定义类型的存储方式还是很值得学习的,希望各位大佬多多提出自己的见解,以便我可以及时修改更新错的知识点,在此谢谢各位!
标签:int,person1,C语言,Person,体在,内存,对齐,结构 From: https://blog.csdn.net/2301_80966914/article/details/142319539