加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#中算术溢出检查的最佳实践是什么?

发布时间:2020-12-15 05:40:14 所属栏目:百科 来源:网络整理
导读:关于’checked’关键字与编译器选项’Check for arithmetic overflow / underflow’的使用,web / stackoverflow上有一些很好的文章,如下所示: http://www.codethinked.com/c-trivia-what-no-overflow Why doesn’t C# use arithmetic overflow checking by
关于’checked’关键字与编译器选项’Check for arithmetic overflow / underflow’的使用,web / stackoverflow上有一些很好的文章,如下所示:

http://www.codethinked.com/c-trivia-what-no-overflow

Why doesn’t C# use arithmetic overflow checking by default?

Best way to handle Integer overflow in C#?

我仍然不知道应该使用哪一个.默认情况下,我更喜欢使用编译器选项来保证安全,不要使用unchecked关键字使我的代码混乱,不要在某些地方忘记它,最后它不常用,所以很多开发人员可能都不知道.

但是,我采取的实际性能有多糟糕?我想MS设置默认不进行溢出检查是有充分理由的.编译器选项是仅涉及我的代码还是每个使用的库和框架本身?

解决方法

我有同样的问题.我更喜欢在我公司的代码中默认检查一段代码,因为溢出副作用可能会花费很多而且难以诊断.发现这些副作用的真正原因可能是每一个有价值的.

问题是,我们在绩效方面会失去什么?

这是一个非常简单的工作台:

static void Main(string[] args)
{
    long c = 0;
    var sw = new Stopwatch();
    sw.Start();
    unchecked
    {
        for (long i = 0; i < 500000000; i++) c += 1;
    }
    sw.Stop();
    Console.WriteLine("Unchecked: " + sw.ElapsedMilliseconds);

    c = 0;
    sw.Restart();
    checked
    {
        for (long i = 0; i < 500000000; i++) c += 1;
    }
    sw.Stop();
    Console.WriteLine("Checked: " + sw.ElapsedMilliseconds);
}

在生成的IL中,我看到checked和unchecked关键字确定是否将使用add.ovf或add指令.
(适用于Debug和Release配置)

IL_001c:  ldloc.2
IL_001d:  ldc.i4.1
IL_001e:  conv.i8
IL_001f:  add


IL_0066:  ldloc.2
IL_0067:  ldc.i4.1
IL_0068:  conv.i8
IL_0069:  add.ovf

结果(x64主机)

调试

>未选中:2371
>检查:2437

发布

>未选中:2088
>检查:2266

通过int(s)替换long(s)的其他结果(x64主机)

调试

>未选中:1665
>检查:1568

发布

>未选中:189
>检查:566

性能受到影响,看起来选择要检查或取消选中的正确变量类型更为重要.无论如何,它并没有改变我的观点.我将在所有项目中打开“检查算术溢出/下溢”! (高级构建设置).

当需要性能时,我将简单地使用未经检查的块.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读