字节对齐、8字节对齐
程序员文章站
2024-03-14 11:37:22
...
在内存管理中经常使用字节对齐来管理分配的内存。
1、原理
- 2字节对齐:要求地址位为2, 4, 6, 8…,地址的二进制最后一位为0(2的1次方)。
- 4字节对齐:要求地址位为4,8,12,16…,地址的二进制最后两位为0(2的2次方)。
- 8字节对齐:要求地址位为8,16,24,32…,地址的最后三位为0(2的3次方)。
- 16字节对齐:要求地址位为16,32,48,64…,地址的最后四位为0(2的4次方)。
- …
2、算法
2.1
unsigned int calc_align(unsigned int n,unsigned align)
{
if ( n / align * align == n)
return n;
return (n / align + 1) * align;
}
2.2 更好的算法
unsigned int calc_align(unsigned int n,unsigned align)
{
return ((n + align - 1) & (~(align - 1)));
}
3、算法说明
(1) (align - 1):表示对齐所需的对齐位,如:
- 2字节对齐位为1;
- 4字节对齐位为11;
- 8字节对齐位111;
- 16字节对齐位为1111;
- …
(2) (n + align - 1):表示n补齐对齐所需数据。
(3) &(~(align - 1)):表示去除由于补齐造成的多余数据。
(4) (n + align - 1) & (~(align - 1)):表示对齐后的数据。