Swift是溢出检查算法的唯一(主流)语言吗?

时间:2015-03-04 09:42:12

标签: performance swift language-agnostic arithmetic-expressions

我今天开始学习Swift语言。我已经倾向于基础和高级操作员。

对我来说,Swift中所有默认算术运算都是针对溢出/下溢进行检查的,这一点有点令人惊讶。

这个功能还有其他主流语言吗?

由于这个原因,Swift运行时的算术是否可能是次优的(性能明智的)?

为什么他们在语言中包含此功能,如果它很好,为什么其他人还没有使用它?

1 个答案:

答案 0 :(得分:4)

<强>性能

这种验证必然要付出代价。在最低级别,导致溢出的操作需要单个CPU操作。在此操作期间检查是否存在溢出需要至少再执行一次操作(例如,使用考虑溢出标志的jump operations(分支)。

请注意,根据实际代码,可能会在编译期间进行大量优化,以避免对每个操作进行耗时检查(简单示例:32位0 +任何短路都不会溢出)

所以,是的,包含支票是不太理想的。

<强>为什么

某些语言包含这种检查以消除程序员的负担。如果程序员不必检查自己,他就不会犯不检查的错误。如果某个语言的程序员不能犯某类错误,那么该语言的可靠性就会提高一点。

至于为什么其他一些语言不包括检查......不同的语言设计者有不同的哲学。对某些人来说,重要的是允许程序员创建尽可能快的理论程序。对于其他一些人来说,帮助程序员编写正确而强大的程序更为重要。例如,C / C ++具有渲染超快程序的声誉,而Ada在您的程序最可能正确之前甚至没有编译的声誉。

有时候这是哲学问题,有时候需要考虑问题。在小型微控制器(小内存,慢速时钟)上,您不希望进行太多自动检查,因为它可能会大大减慢程序的执行速度。

其他语言

Here's a small table关于语言处理(或不处理)整数溢出的不同方式。有些语言会留给程序员。有些人提出例外。有些人会更改数据类型以接受结果而不会出错(例如:int to long,long to BigInteger)。