(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
热门推荐
婴儿反复拉肚子是什么原因引起的
偿还:一部展现人性复杂性的电影佳作
如何设置无线桥接路由器可以让网络覆盖范围变大?
窝阔台的大战略
为什么家养的土鸡比养鸡场的蛋鸡下蛋少?
合肥美食攻略十大必吃排行榜,解锁庐州味蕾的十大佳肴
首富的诞生与八字有关
"金刀计"是什么计策,"金刀计"的历史典故是什么?
企业如何通过移动端报表提升运营效率并降低成本?
IGN教你入门《怪猎荒野》:鬼泣还是黑魂全看武器选择
腋下净味:五种实用解决方案
如何进行管理费用审计
《美妙旋律》共有几季?每季又有多少集?
美国宇航局的重返月球任务,再次推迟
考公应届毕业生的认定标准与身份保留指南
NE5532双通道运算放大器:性能特点与典型应用
春天小草摄影技巧:捕捉生机与美好的瞬间
世界各地父亲节的日期
蒸汽清洗机有哪些使用场景和适用对象?
近视眼矫正适合的年龄?什么年龄做近视手术较为适宜?
废旧电瓶荒:铅价逆势高歌,再生铅企业“巧妇难为无米之炊”
HTML5 本地存储(LocalStorage)使用教程
徐志摩与陆小曼:他看到了她身上作为“人”的光华
眼科验光预约流程及视力检测指南
视频剪辑师工资一般多少 薪资待遇好吗
建行贷款催收全流程及应对指南
6-12岁儿童注意力训练指南:从游戏到生活全方位提升专注力
2025年山东省经济社会形势分析暨山东系列蓝皮书发布
数字贸易成为国际贸易新引擎,全球数字贸易规则如何发展?
【幼儿蒙学】领略中国古诗词之美——《书湖阴先生壁》