我正在阅读 C 代码:
void **alignedData = (void **)(((size_t)temp + aligned - 1)&-aligned);
我不知道方法,尤其是 &-
部分。
谁能解释一下?
谢谢!
最佳答案
使用它时,aligned
应该是无符号类型(或者 C 实现应该使用二进制补码)并且具有一个 2 的幂的值。然后此代码计算要分配的内存量:
(size_t) temp
将temp
转换为无符号类型size_t
,适用于处理大小。这将是要分配的字节数。(size_t) temp + aligned - 1
添加足够的字节以保证aligned
的倍数落在数字temp
和之间>temp + aligned - 1
,包括在内。例如temp
为37,aligned
为8,则在37和44之间(37+8−1),有8的倍数(40)。-aligned
生成位掩码,每个位位置为 1,是aligned
的倍数,低位为 0。比如aligned
为8,那么代表-aligned
的位就是111…111000,因为最后的000位代表1、2、4的值,而其他位表示值 8、16、32 等。(size_t) temp + aligned - 1
与-aligned
的&
(按位与),然后清除低位,只留下aligned
倍数的位。因此,它会产生区间内aligned
的倍数。例如,对于前面提到的 37 和 8 的值,((size_t) temp + aligned - 1) & -aligned
产生 40。
因此,此表达式生成 temp
的值,四舍五入为 aligned
的下一个倍数。它说“计算我们需要分配的字节数,它至少是 temp
字节并且是 aligned
的倍数。”
在此之后,代码将此数字转换为类型 void **
并使用它来初始化 void **alignedData
。那是糟糕的 C 代码。通常没有充分的理由。像这样的字节数不应该用作任何类型的指针。该代码可能试图通过其他软件强制使用的数据类型“走私”该值,但可能有更好的方法来做到这一点,例如分配内存来保存该值并提供指向该内存而不是尝试直接转换值。找到更好的解决方案需要了解更多代码上下文。
关于c - 神秘双指针赋值的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66399796/