为什么网站上传照片传不上去,门户网站建设管理工作,儿童做网站,网站制作北京网站建设公司哪家好揭秘C语言结构体#xff1a;通往内存对齐的视觉之旅
引言 在C语言的编程旅程中#xff0c;结构体#xff08;structs#xff09;是一个关键而强大的概念。结构体不仅允许我们组织和存储不同类型的数据#xff0c;而且通过深入了解内存对齐#xff0c;我们可以更好地优化…揭秘C语言结构体通往内存对齐的视觉之旅
引言 在C语言的编程旅程中结构体structs是一个关键而强大的概念。结构体不仅允许我们组织和存储不同类型的数据而且通过深入了解内存对齐我们可以更好地优化程序性能。在这篇博客文章中我们将全面研究C语言结构体包括定义、变量创建、初始化以及内存对齐等方面。通过丰富的图示和深入的代码解读我们将带你深入探索这一重要的数据结构。 1. 结构体类型的定义
首先我们需要了解如何定义一个结构体类型。结构体类型是用户自定义的数据类型通过struct关键字实现。下面是一个简单的例子
struct Stu
{char name[50];int age;float height;
};Stu结构体包含了姓名、年龄和身高三个成员。 2. 结构体变量的创建与初始化
结构体类型定义后我们可以创建相应的结构体变量并进行初始化。以下是一个例子
#include stdio.h
struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
};
int main()
{//按照结构体成员的顺序初始化struct Stu s { 张三, 20, 男, 20230818001 };printf(name: %s\n, s.name);printf(age : %d\n, s.age);printf(sex : %s\n, s.sex);printf(id : %s\n, s.id);//按照指定的顺序初始化struct Stu s2 { .age 18, .name lisi, .id 20230818002, .sex ⼥printf(name: %s\n, s2.name);printf(age : %d\n, s2.age);printf(sex : %s\n, s2.sex);printf(id : %s\n, s2.id);return 0;
}3.内存对齐程序性能的守护者
内存对齐对于提高程序性能至关重要。它确保结构体中的每个成员从其大小的倍数地址开始存储以最小化内存访问时间。
3.1 对齐规则
首先得掌握结构体的对齐规则 结构体的第⼀个成员对齐到和结构体变量起始位置偏移量为0的地址处其他成员变量要对齐到某个数字对齐数的整数倍的地址处。 对齐数 编译器默认的⼀个对⻬数 与 该成员变量大小的较小值。 VS 中默认的值为 8结构体总大小为最⼤对齐数结构体中每个成员变量都有⼀个对齐数所有对齐数中最大的 整数倍。如果嵌套了结构体的情况嵌套的结构体成员对⻬到⾃⼰的成员中最大对齐数的整数倍处结构 体的整体大小就是所有最⼤对齐数含嵌套结构体中成员的对齐数的整数倍。 3.2练习
typedef struct {int a;char b;short c;short d;
}AA_t;int main()
{printf(%d\n, sizeof(AA_t));return 0;
}#include stdio.h
union Un
{short s[7];int n;
};
int main()
{printf(%d\n, sizeof(union Un));return 0;
}4.实际案例取消内存对齐
#include stdio.hstruct PackedData {char a;int b;char c;
} __attribute__((packed));int main() {struct PackedData packedStruct;printf(PackedData的大小%zu 字节\n, sizeof(packedStruct));return 0;
}通过上面的代码我们演示了如何通过__attribute__((packed))取消结构体的内存对齐进而影响结构体的大小。
5.结论
通过这篇博客的全方位解读你应该对C语言中的结构体有了更深入的了解。从定义到初始化再到内存对齐我们用图解和案例为你展现了结构体的方方面面。希望这篇文章能够帮助你更好地掌握C语言结构体为你的编程之路增添亮丽的一笔。