本文主要介绍内存对齐的概念和方法,并讲述在host与device之间DMA传输时,一个与“内存对齐”相关的,并最终引起系统概率性蓝屏的bug。
一、“内存对齐”的概念
内存对齐,又称为字节对齐,是一个数据类型所能存放的内存地址的属性。这个属性实际上就是内存地址,它需要符合一定的规范。这个规范就是内存地址值必须是2的N次方。当我们说一个数据类型的内存对齐为8时,(或按8字节对齐时),实际上指的是它的内存地址值可以被8整除。
内存对齐的要求,是由CPU处理内存的方式决定的(或者说寻址方式,它与地址总线的宽度相关)。详细参考我链接的博文2。在此简单的总结一下内存对齐的基本规范:
1)标准类型:自然对齐(Naturally Aligned)即可。对齐属性和它的类型大小相等,或整数倍。
2)数组:按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。
3)联合:按其包含的长度最大的数据类型对齐。
4)结构体:结构体中每个数据类型都要对齐。
下面通过一段代码来看看在VS调试器中,内存的对齐和填充
<span style="font-size:14px;"> struct stu
{
char sex;
int length;
char name[10];
};
stu a{ 'g', 256, "jaojido" };
cout << "sizeof(stu) = " << sizeof(stu) << endl;
cout << "sizeof(a) = " << sizeof(stu) << endl;</span>