Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于“ngx_palloc”的几个问题?_C_Nginx - Fatal编程技术网

关于“ngx_palloc”的几个问题?

关于“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 =

在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 = 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)