在LWIP库里面,我们看到很多对齐的语句
上代码1:
#ifndef MEM_ALIGNMENT
#define MEM_ALIGNMENT 4 //表示4个字节对齐
#endif
#ifndef LWIP_MEM_ALIGN_SIZE
#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
#endif
实际对齐例子:
#include <stdio.h>
#ifndef MEM_ALIGNMENT
#define MEM_ALIGNMENT 4
#endif
#ifndef LWIP_MEM_ALIGN_SIZE
#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
#endif
/*
*请注意LWIP的内存对齐size一定是2^n次方的方式对齐,
*对齐计算方法如下
*/
//size = 14 为例, MEM_ALIGNMENT =4
//(14 + 4 - 1 ) & ~(4 - 1)
//所以size + MEM_ALIGNMENT - 1的范围是size < (size + MEM_ALIGNMENT - 1) < (size + MEM_ALIGNMENT)
//17 & ~3 //取反去除(MEM_ALIGNMENT - 1)上的位
//10001
//11100
//-----------
//10000 //得出正确的结果
void main()
{
int size = 13;
printf("size:%d\n", LWIP_MEM_ALIGN_SIZE(size));
}