内存对齐详解+代码展示
创作时间:
作者:
@小白创作中心
内存对齐详解+代码展示
引用
CSDN
1.
https://blog.csdn.net/2301_80667728/article/details/144091493
内存对齐是C语言编程中的一个重要概念,它关系到程序的性能和正确性。本文将从内存对齐的定义、意义、规则,以及如何通过代码改变内存对齐方式等方面进行详细讲解。
一、内存对齐的定义
内存对齐是指数据在内存中存放时,按照某种规则将数据放置到内存地址的过程。这种规则通常是由编译器和硬件平台共同决定的,目的是为了提高内存访问的效率。在现代计算机中,访问未对齐的内存地址可能会导致性能下降甚至出现错误。
二、内存对齐的意义(为什么存在内存对齐?)
(1) 硬件平台的限制:
某些处理器可能要求访问特定类型数据时,数据必须位于特定的内存地址上,否则会触发异常或者需要额外的处理时间。
(2)提高访问效率:
如果数据按照内存对齐规则存储,CPU可以在一次内存访问操作中获取完整的数据,无需进行额外的拼接或拆分操作,从而提高了内存访问的速度。
三、内存对齐的规则
(1)基本数据类型的对齐规则:
char类型的变量可以存放在任意地址上,因为其大小为1字节。short类型的变量通常要求其地址是2的倍数。int类型的变量通常要求其地址是4的倍数。long类型的变量通常要求其地址是4或8的倍数(取决于编译器和平台)。float类型的变量通常要求其地址是4的倍数。double类型的变量通常要求其地址是8的倍数。- 指针类型的变量通常要求其地址是4或8的倍数(取决于硬件平台的位数)。
(2)结构体的对齐规则:
- 结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员变量大小的较小值。
- VS编译器中默认对齐数的值为8。
- Linux中gcc编译器没有默认对齐数,对齐数就是成员自身的大小。
- 结构体总大小为最大对齐数(结构体中每个成员变量都有一个对齐数,所有对齐数中最大的)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。
四、示例
#include <stdio.h>
// 定义一个名为 A的结构体
typedef struct A
{
// 结构体的第一个成员是一个字符型变量 a
char a;
// 结构体的第二个成员是一个整型变量 b
int b;
}A;
int main()
{
// 使用 printf函数打印结构体 A 的大小
printf("%zd\n", sizeof(struct A));
// %zd 是 printf 的格式说明符,用于打印 size_t 类型的数据,即结构体的大小
return 0;
}
- 输出结果展示:
- 结果分析(如下图):
五、改变结构体的内存对齐方式
在某些编译器中,我们可以使用特定的指令来控制内存对齐的方式。例如,在编译器中,可以使用#pragma pack指令来设置结构体的对齐方式。
以下是一个示例:
#include <stdio.h>
// 保存当前对齐状态,并设置对齐方式为 1字节对齐
// 这意味着结构体的每个成员将按照其自然大小排列,不会有额外的填充
#pragma pack(1)
typedef struct A
{
char a; // 结构体的第一个成员是一个字符型变量 a,占用 1个字节
int b; // 结构体的第二个成员是一个整型变量 b,通常占用 4个字节
}A;
// 恢复之前的对齐状态,通常是 8 字节对齐
#pragma pack()
int main()
{
// 使用 printf 函数打印结构体 A 的大小
// %zd是 printf 的格式说明符,用于打印 size_t 类型的数据,即结构体的大小
printf("%zd\n", sizeof(A));
return 0;
}
- 输出结果展示:
- 结果分析(如下图):
代码分析:
由于使用了#pragma pack(1),结构体A的大小将正好是5个字节,因为char占用1个字节,int占用4个字节,且没有额外的填充字节。这种对齐方式通常用于需要最小化结构体大小的场景,例如网络传输或者嵌入式系统编程。
总结
内存对齐是数据按特定规则存放内存以提高访问效率,受硬件和编译器影响,如结构体需对齐最大成员,可用指令调整,但需注意性能。
热门推荐
吕雉:从平民到皇太后的逆袭人生
吕雉:开创中国女性执政先河的政治家
吕太后统治下的西汉政局:权力与斗争的15年
大雪节气将至,《逢雪宿芙蓉山主人》里的诗意雪景
风雪夜归人:刘长卿《逢雪宿芙蓉山主人》的意境与深意
双嘧达莫(潘生丁)的临床应用与超说明书使用指南
《甜蜜暴击》:青春校园里的甜蜜邂逅与成长
如何通过日常观察发现宝宝脊髓性肌萎缩症迹象?
面对SMA:如何进行心理调适
如何在宝宝身上发现脊髓性肌萎缩症?
GC101:中国首个针对2型SMA的基因治疗药物获突破性认定
探访“世界温泉健康名镇”:温汤镇的历史与文化
冬日泡汤打卡:宜春温泉温汤镇&明月山
秋冬泡温泉,宜春温汤镇成新宠!
如何处理抑郁症社交压力?如何增加抑郁症患者的社会支持?
高血压用药新选择:厄贝沙坦与洛尔类降压药的完美搭档
厄贝沙坦:高血压治疗中的心血管保护利器
太极拳:世界非遗的东方瑰宝
少林功夫:中外习武者的心灵圣地
吕雉执政下的西汉社会大变局
股票估值中的PB,市净率的理解与应用
《甄嬛传》里的她竟是乾隆亲妈?
七夕将至!超甜情侣头像设计攻略
逆光拍摄+局部特写:完美情侣头像秘籍
后土娘娘诞辰:揭秘大地之母的神秘面纱
戴春荣:从“皇后娘娘”到慈母,一位艺术家的双面人生
基金定投的优缺点?有哪些技巧?
如何在市场波动中进行基金定投?这些定投策略对投资者有何影响?
幽门螺旋杆菌检测方法有哪些
“女士”还是“姑娘”?教你正确选择女性称谓