关于“ngx_palloc”的几个问题?
在nginx中,以关于“ngx_palloc”的几个问题?,c,nginx,C,Nginx,在nginx中,以ngx\u pcalloc()开头的指针确保最低2位为00 例如,p=ngx\u pcalloc(池,大小),确保((uintpttr)p)和(0x3)==0 如果你能帮助我,我将不胜感激 如何确保wdc的低位2位为00 我可能不明白这个问题。但照现在的情况看,这就是答案 |二进制或运算符不能将wdc的任何位的值更改为0 二进制和&可以。如果您想清除2个最低位,可以使用&: uintptr_t v = 0; v = ~v // v holds 1's v =
ngx\u pcalloc()开头的指针确保最低2位为00
例如,p=ngx\u pcalloc(池,大小)
,确保((uintpttr)p)和(0x3)==0
如果你能帮助我,我将不胜感激
如何确保wdc
的低位2位为00
我可能不明白这个问题。但照现在的情况看,这就是答案
|
二进制或运算符不能将wdc
的任何位的值更改为0
二进制和&
可以。如果您想清除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.
好的!现在的问题是:
在nginx中,以ngx_pcalloc()开头的指针确保
2位是00
它已经是00
。你什么都不用做。根据
只是ngx_palloc()
的包装器,它还将分配的每个字节设置为0
如何确保wdc
的低位2位为00
我可能不明白这个问题。但照现在的情况看,这就是答案
|
二进制或运算符不能将wdc
的任何位的值更改为0
二进制和&
可以。如果您想清除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.
好的!现在的问题是:
在nginx中,以ngx_pcalloc()开头的指针确保
2位是00
它已经是00
。你什么都不用做。根据
只是ngx_palloc()的包装器,它还将分配的每个字节设置为0 ngx\u pcalloc的代码在中,因此您可以跟踪它的调用,查看它是否返回与
ngx\u对齐的内存
在大多数平台上,如无符号long
的大小。Solaris似乎是个例外:在这里它被定义为\u MAX\u ALIGNMENT
,它包括无符号长的对齐方式
C标准要求无符号long
的最小大小为32位(4字节)。因此,返回的指针值必须是4的倍数,较低的两位(代表值1和2)将始终为零。ngx\U pcalloc的代码位于中,因此您可以跟踪它的调用,查看它是否返回与ngx\U对齐的内存
在大多数平台上,如无符号long
的大小。Solaris似乎是个例外:在这里它被定义为\u MAX\u ALIGNMENT
,它包括无符号长的对齐方式
C标准要求无符号long
的最小大小为32位(4字节)。因此,返回的指针值必须是4的倍数,低两位(代表值1和2)将始终为零。不要放置链接来显示代码。把相关的代码放在这里。不要放链接来显示代码。把相关代码放在这里。对不起,我添加了一个有问题的例子,我的观点是((uintpttr_t)p)和(0x3)==0
而不是(*p)和(0x3)==0
。对不起,我添加了一个有问题的例子,我的观点是((uintpttr_t)p)和(0x3)==0
而不是(*p)和(0x3)==0
。
ngx_pcalloc
void *ngx_pcalloc(ngx_pool_t *pool, size_t size)