gpt4 book ai didi

c# - 算术检查语句放在哪里?

转载 作者:行者123 更新时间:2023-11-30 15:29:55 27 4
gpt4 key购买 nike

我正在阅读有关如何强制操作抛出溢出异常的内容,并且在“自己尝试”部分中,我在与本书不同的地方找到了它。我很好奇是否存在与某个位置相关的性能问题,因为我不确定 checked 关键字的基 native 制。

书中的例子是做一个阶乘,它会很快抛出溢出,即使是一个无符号长整数。这是我想出的代码:

static long Factorial (long number) {
long result = 1;

for (int i = 2; i <= number; i++) {
checked {
result *= i;
}
}

return result;
}

但是,查看书后的答案页,他们将 checked 包裹在整个函数体中,包括 return长结果 = 1;。显然在那些地方你永远不需要一个,所以如果有的话,我会把 for 循环包装在 check 中。

它是否存在于循环中导致重复生成某些底层 CLR 代码? (比如为什么要在进入 for 循环之前声明一个变量。)或者在循环中没有开销?

最佳答案

就编译结果而言,差别不大。

主要区别在于 checked block 中的任何算术运算都将使用不同的 IL 指令。没有更多说明,只有不同的说明。而不是 mul , 你得到 mul.ovf - 而不是 add , 你得到 add.ovf

但是,您的版本实际上具有略微不同的行为。由于您将 checked block 放在更严格的范围内,因此变量增量 (i++) 仍将处于未选中状态。原件会一直检查,这意味着 i++ 可以抛出,而不仅仅是乘法运算。这确实意味着您的版本更快,但这只是因为您避免了溢出检查并更改了结果行为,而不是因为范围更改。

Is the presence of it inside the loop causing some underlying CLR code to be generated repeatedly?

不,这只是意味着该范围内的那些 IL 指令将获得带有溢出检查的不同 IL 操作代码,而不是标准操作代码。

Or is there no overhead having it inside the loop?

没有开销(除了指令本身检查的额外开销)。

关于c# - 算术检查语句放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22968910/

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