在nginx中,有很多有意思的宏,今天来说说,nginx用来对齐的两个宏(src/core/ngx_config.h):
#define ngx_align(d, a) (((d) + (a - 1)) & ~(a - 1))
#define ngx_align_ptr(p, a) \
(u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))
简而言之,一共有一下几点注意到就行了:
1、uintptr_t 并非unsigned int *,它被定义在/usr/include/stdint.h:
/* Types for `void *' pointers. */
#if __WORDSIZE == 64
# ifndef __intptr_t_defined
typedef long int intptr_t;
# define __intptr_t_defined
# endif
typedef unsigned long int uintptr_t;
#else
# ifndef __intptr_t_defined
typedef int intptr_t;
# define __intptr_t_defined
# endif
typedef unsigned int uintptr_t;
#endif
2、对于2的幂的求模运算:
a % b <=> a & (b - 1)