在nginx中,由ngx_pcalloc()
初始化的指针确保最低的2位为00
?
例如,p = ngx_pcalloc(pool, size)
,请确保((uintptr_t)p)&(0x3) == 0
?
如果你帮助我,我将不胜感激。
答案 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)将始终为零。