关于`ngx_palloc`的一些问题?

时间:2018-02-17 13:52:04

标签: c nginx

在nginx中,由ngx_pcalloc()初始化的指针确保最低的2位为00

例如,p = ngx_pcalloc(pool, size),请确保((uintptr_t)p)&(0x3) == 0

如果你帮助我,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

  

如何确保wdc的低2位为00。?

我可能不明白这个问题。但是按原样,这就是答案。

|二进制OR运算符无法将wdc的任何位值更改为0

二进制AND &可以。如果您打算清除2个最低位,可以使用&

uintptr_t v = 0;
v = ~v          // v holds 1's
v = v<<2;       // 0's go to the 2 lowest bits

name->value = (void *) ((uintptr_t) wdc & v); // clearing 2 bits.

在问题被编辑之后,看起来我们必须检查wdc的2个低位是否确实为零才能继续。这很简单:

 if ( (wdc & 0x03) == 0 ) // check if both lower bits of wdc are zero 
  {

  }

确定!现在的问题是:

  

在nginx中,由ngx_pcalloc()初始化的指针确保最低   2位是00?

已经是00。你不需要做任何事情。根据{{​​3}}

ngx_pcalloc
void *ngx_pcalloc(ngx_pool_t *pool, size_t size)

只是ngx_palloc()的包装器,它还将分配的每个字节设置为0.

答案 1 :(得分:1)

ngx_pcalloc的代码位于ngx_palloc.c中,因此您可以按照其调用来查看它返回的内存与NGX_ALIGNMENT对齐。

在大多数平台上,NGX_ALIGNMENT is defined等于unsigned long的大小。 Solaris似乎是一个例外:它被定义为"Equal to the maximum of all the above _XXX_ALIGNMENT values"_MAX_ALIGNMENT,其中包括无符号长整型的对齐方式。

C标准要求unsigned long的最小大小为32位(4字节)。因此,返回的指针值必须为4的倍数,并且低两位(代表值1和2)将始终为零。