gpt4 book ai didi

c - 神秘双指针赋值的解释

转载 作者:行者123 更新时间:2023-12-02 16:16:56 24 4
gpt4 key购买 nike

我正在阅读 C 代码:

 void **alignedData = (void **)(((size_t)temp + aligned - 1)&-aligned); 

我不知道方法,尤其是 &- 部分。

谁能解释一下?

谢谢!

最佳答案

使用它时,aligned 应该是无符号类型(或者 C 实现应该使用二进制补码)并且具有一个 2 的幂的值。然后此代码计算要分配的内存量:

  • (size_t) temptemp 转换为无符号类型 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com