nginx中的整型
nginx中对整型做了一次重新定义:
typedef intptr_t ngx_int_t; typedef uintptr_t ngx_uint_t; typedef intptr_t ngx_flag_t;
至于intptr_t,uintptr_t,intptr_t在头文件/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
可以看到注释是: Types for `void *’ pointers. 那么这是什么含义呢?
我们知道所谓的指针,其实是内存的地址,而内容是该地址内存中实际存储的数据。void *是指无类型指针,当需要进行转化时,这个类型可以被安全的在 void * 和整数间转换,而不会出现由于指针和整型的字宽不同导致的问题。
C语言中,指针和整数之间的转换经常用到(多用于需要精确控制数据在内存中的精确布局时),在32位平台上,由于指针类型的字宽和int相同,所以我们不太在意这个问题。但是到了 64 位平台上,由于目前几乎所有64位系统都采用LP64模型,既整数依旧是32位,而指针是64位的。intptr_t 这个数据类型就成了安全跨平台编程的保证。也就是说,当你需要把指针作为一个整数来运算时,转换成 intptr_t才是安全的,可以在运算完毕安全的转回指针类型。
发表评论