#define MEM_SIZE 15
#define MEM_ALIGNMENT 4
#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
其中MEM_SIZE 为要申请对齐字节数。MEM_ALIGNMENT 为对齐方式,4字节或2字节,1字节都可以
自己的理解:
所谓的 内存对其,就是讲内存数据个数对齐,假如对齐方式为4个字节,则需要的内存块应该为4的倍数。
假如要申请一个13个字节的内存块,要求对齐方式为4个字节,则内存块的实际大小应该为4的倍数,计算方式就是
LWIP_MEM_ALIGN_SIZE(13) 结果为(13+4-1)&~(4-1)=(0001 0000)&(1111 1100)=0001 0000=16
则内存块的实际大小为16个字节。
假如要申请一个14字节的内存块,且对齐方式要求也为4个字节,则内存块实际大小为:
LWIP_MEM_ALIGN_SIZE(14) 结果为(14+4-1)&~(4-1)=(0001 0001)&(1111 1100)=0001 0000=16
则内存块大小仍为16个字节。即4的倍数。
假如要申请一个12字节的内存块,且对齐方式要求也为4个字节,则内存块实际大小为:
LWIP_MEM_ALIGN_SIZE(12) 结果为(12+4-1)&~(4-1)=(0000 1111)&(1111 1100)=0000 1100=12
则内存块大小为12个字节。因为12就是4的倍数。所以申请后的内存空间即为12个字节。
下面是别人写的内存对齐的理解,有助于大家进一步理解内存对齐的意义。
http://capacity.blog.163.com/blog/static/20866413120125298408973/
在小型嵌入式系统中,往往需要自己设立内存管理模块,而内存对齐对后面的数据存储有着很大的影响。结合LWIP协议栈介绍一个内存对齐的方式,参见下面程序:
下面分析一下此种方式的要点,这是对齐方式为1字节
#define MEM_SIZE 15 #define MEM_ALIGNMENT 1 #define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
LWIP_MEM_ALIGN_SIZE(MEM_SIZE ) = 15;//当1字节对齐的时候,内存对齐(也可以认为是内存调整)后的值为15这是对齐方式为2字节
#define MEM_SIZE 15 #define MEM_ALIGNMENT 2 #define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
LWIP_MEM_ALIGN_SIZE(MEM_SIZE ) = 16 ; //当1字节对齐的时候,内存对齐(也可以认为是内存调整)后的值为 16这是对齐方式为4字节
#define MEM_SIZE 15 #define MEM_ALIGNMENT 4 #define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
LWIP_MEM_ALIGN_SIZE(MEM_SIZE ) = 16 ; //当1字节对齐的时候,内存对齐(也可以认为是内存调整)后的值为 16