gpt4 book ai didi

c - (x | y) - y 为什么不能简单地是 x 甚至 `x | 0`

转载 作者:行者123 更新时间:2023-12-03 09:10:00 26 4
gpt4 key购买 nike

我正在阅读内核代码,在一个地方我看到了 if 里面的一个表达式像这样的语句

if (value == (SPINLOCK_SHARED | 1) - 1) {
............
}

哪里 SPINLOCK_SHARED = 0x80000000是一个预定义的常数。

我想知道为什么我们需要 (SPINLOCK_SHARED | 1) - 1 - 用于类型转换?表达式的结果将是 80000000-- 与 0x80000000 相同,不是吗?然而,为什么 ORing 1 和 Subtracting 1 很重要?

有一种感觉,我想得到一些东西..

最佳答案

这样做只是为了清楚起见,仅此而已。这是因为 atomic_fetchadd_int()(例如 sys/spinlock2.h)在加法/减法之前返回值,并且该值被传递给 _spin_lock_contested()

请注意,C 编译器会完全预先计算所有常量表达式。事实上,编译器甚至可以根据使用传入过程参数的条件来优化内联代码,当过程在这些参数中传递常量时。这就是为什么 sys/lock.h 中的内联 lockmgr() 有一个 case 语句......因为整个 case 语句将被优化并转化为对适当函数的直接调用。

此外,在所有这些锁定函数中,原子操作的开销使所有其他计算相形见绌两个或三个数量级。

-马特

关于c - (x | y) - y 为什么不能简单地是 x 甚至 `x | 0`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59409664/

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