(C语言进阶)结构体内存对齐和修改默认对齐数
创作时间:
作者:
@小白创作中心
(C语言进阶)结构体内存对齐和修改默认对齐数
引用
CSDN
1.
https://blog.csdn.net/2301_79580018/article/details/134779800
在C语言中,结构体的内存对齐是一个重要的概念,它影响着程序的性能和内存使用效率。本文将详细介绍结构体的内存对齐机制,解释为什么需要内存对齐,以及如何通过修改默认对齐数来优化内存使用。
一.结构体内存对齐
结构体内存大小计算方法:
偏移量:是指某个成员在结构体中相对于结构体首地址的偏移字节数。在计算机中,结构体是一种自定义数据类型,它由多个不同类型的成员组成。每个成员在内存中的存储位置是连续的,而结构体本身在内存中的存储位置也是连续的。因此,计算某个成员的偏移量可以帮助我们更好地理解结构体在内存中的存储方式。
例一:
例二:
例三:
嵌套的结构体会对齐到自己的最大对齐数,结构体整体大小为所有元素对齐数的最大值的整数倍
二.为什么存在内存对齐
内存对齐的主要目的是提高访问效率。现代计算机的内存系统通常以字(word)为单位进行访问,而字的大小通常是2的幂次方(如2、4、8字节)。如果数据没有正确对齐,处理器可能需要进行多次内存访问才能读取一个完整的数据项,这会显著降低性能。
此外,某些硬件平台甚至不允许非对齐访问,尝试这样做会导致硬件异常。
三.节省空间的方法
虽然内存对齐可以提高性能,但有时我们也需要优化内存使用。可以通过以下方式来节省空间:
- 重新排列结构体成员,将小的成员放在大的成员后面
- 使用
#pragma pack指令来调整对齐数
四.修改默认对齐数
默认情况下,编译器会根据目标平台的特性选择一个合适的对齐数。但有时我们可能需要手动调整这个值,以优化内存使用或满足特定需求。
例一:
修改前:
#include<stdio.h>
#include<stddef.h>
typedef struct S1
{
int a;
double b;
}S1;
int main()
{
printf("%zu\n",offsetof(S1,a));
printf("%zu\n", offsetof(S1,b));
printf("%zu",sizeof(S1));
return 0;
}
修改后:
#include<stdio.h>
#include<stddef.h>
#pragma pack(4)
typedef struct S1
{
int a;
double b;
}S1;
#pragma pack()
int main()
{
printf("%zu\n",offsetof(S1,a));
printf("%zu\n", offsetof(S1,b));
printf("%zu",sizeof(S1));
return 0;
}
例二:
修改前:
#include<stdio.h>
#include<stddef.h>
typedef struct S1
{
int a;
char b;
double c;
}S1;
int main()
{
printf("%zu\n",offsetof(S1,a));
printf("%zu\n", offsetof(S1,b));
printf("%zu\n", offsetof(S1,c));
printf("%zu",sizeof(S1));
return 0;
}
修改后:
#include<stdio.h>
#include<stddef.h>
#pragma pack(1)
typedef struct S1
{
int a;
char b;
double c;
}S1;
#pragma pack()
int main()
{
printf("%zu\n",offsetof(S1,a));
printf("%zu\n", offsetof(S1,b));
printf("%zu\n", offsetof(S1,c));
printf("%d",sizeof(S1));
return 0;
}
本文原文来自CSDN
热门推荐
如何在出事故后合理使用交强险?交强险在事故处理中的作用有哪些局限性?
韩国酒店禁用一次性用品:全面执行与逐步过渡并存
让路由器保持完美状态并避免出现问题的技巧
猫娘prompt:探索萌系幻想与创意写作的无限可能
AE时间调整完全指南:8种实用方法详解
美国学校成绩等级有哪些形式和影响
卡罗拉变速箱油多久换一次?全面解析与保养建议
食用香精香料的法规与标准
德国留学费用与澳洲留学费用对比分析
数独解题技巧与逻辑推理:从入门到精通
孩子如何学算法课程
心理学“蜜月宿醉效应”:感情进入倦怠期,才会有这些表现
高中生睡眠质量影响因素及改善建议
急支糖浆和强力枇杷露都治疗什么咳嗽?如何正确选择?
土葬为什么会被火葬取代?压倒土葬的最后一根稻草,其实是科学!
租约期间房东带人看房的法律边界
适合盆栽的蔬菜有哪些品种?
物业小区远程抄表水电管理系统:智能管理的新时代
2025年考研复试听力考什么?全面解析与备考指南
攻破他的心理防线!掌握说服6大技巧,让对方说YES
这4种每天接触的“家居物品”,是真的不安全,别再用了
我常遇到的8个数据可视化的错误,值得借鉴
技术突破、AI接入、北斗赋能 中国电动汽车产业未来这么干
四轮摩托车的驾驶技巧有哪些?这些技巧在实际操作中如何应用?
大脑前额叶功能训练:提升专注力与执行能力的科学方法
法琳·托登:从温柔的魔术师到狂乱的奇美拉
胰腺不舒服看什么科
鲤鱼灯舞里的非遗年俗
青岛能源所新型高比能硫化物全固态电池取得新进展
出现团队背叛如何处理