gpt4 book ai didi

c# - 通过强制转换为 uint 而不是检查负值来执行范围检查是否更有效?

转载 作者:IT王子 更新时间:2023-10-29 03:39:45 32 4
gpt4 key购买 nike

我在 .NET 的 List source code 中偶然发现了这段代码:

// Following trick can reduce the range check by one
if ((uint) index >= (uint)_size) {
ThrowHelper.ThrowArgumentOutOfRangeException();
}

显然这比 if (index < 0 || index >= _size) 更有效(?)

我很好奇这个把戏背后的原理。单个分支指令真的比两次转换到 uint 更昂贵吗? ?或者是否有其他一些优化可以使这段代码比额外的数字比较更快?

解决房间里的大象问题:是的,这是微优化,不,我不打算在我的代码中到处使用它——我只是好奇 ;)

最佳答案

来自 MS Partition I ,第 12.1 节(支持的数据类型):

The signed integer types (int8, int16, int32, int64, and native int) and their corresponding unsigned integer types (unsigned int8, unsigned int16, unsigned int32, unsigned int64, and native unsigned int) differ only in how the bits of the integer are interpreted. For those operations in which an unsigned integer is treated differently from a signed integer (e.g., in comparisons or arithmetic with overflow) there are separate instructions for treating an integer as unsigned (e.g., cgt.un and add.ovf.un).

也就是说,从 intuint转换只是一个簿记问题 - 从现在开始,值在堆栈上/在寄存器中现在已知是 unsigned int 而不是 int。

所以一旦代码被 JITted,这两个转换应该是“自由”的,然后可以执行无符号比较操作。

关于c# - 通过强制转换为 uint 而不是检查负值来执行范围检查是否更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29343533/

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