今天参加了入职前的小小的培训,培训中老师讲到了关于内存对齐的只是,以前接触过,但是没有深究,今天老师讲了,回来便查了查资料,下面便是我对内存对齐的理解。
内存对齐对于大部分的软件工程师来说都可以说是透明的,内存对齐应该是编译器去管理的,C语言的特点就是强大灵活,他允许你对内存进行操作。如果你想对深层次的更加底层的东西要加以理解,就必须对内存对齐要有一定的了解。
首先是为什么我们需要对内存对齐:
1)平台的原因:不是所有的平台都能访问任意地址上的任意数据的,某些硬件平台只能访问某些地址处的某些类型的数据,否则就异常;
2)性能的问题:为了访问为对齐的数据,处理器要作两次的内存访问;
对齐的规则:
通常我们都讨论的是结构体的数据在内存中的布局,首先第一个数据放在offset为0的位置上,后面的数据的布局按照数据本身和系统默认的“对齐系数”或者是通过预编译#pragma pack()设置的“对齐系数”中的较小的那个进行。
最后注意下圆整性就好了,也就是说最后结构体占据的内存空间的大小是系统默认“对齐系数”或者预编译设置的“对齐系数”的整数倍即可。
举个例子:
#include <stdio.h> #pragma pack(4) struct xx{ char b; long long a; int c; char d; }; #pragma pack() int main() { struct xx x1; printf("&a=%p\n",&x1.a); printf("&b=%p\n",&x1.b); printf("&a=%p\n",&x1.c); printf("&b=%p\n",&x1.d); printf("%d",sizeof(x1)); return 0; }
通过结果我们可以看到首先b放在了offset为0的地方,接下来a为long long型,占8个字节,预编译设置的为4字节,所以b后面会预留3个字节,以此类推,最后又添加了3个字节,是为了满足圆整性的要求。
时间: 2024-12-05 12:24:29