스위프트의 정수 기본 연산자는 오버플로 버그를 없애기 위해 항시 오버플로 확인을 수행합니다. 만약에 높은 성능이 필요한 상황이고, 오버플로의 발생 가능성이 없다고 판단한다면 이런 오버플로 확인은 의미없는 비용이 될 뿐입니다. 이런 경우에는 래핑된 정수 산술식을 활용하는 것이 성능에 좋습니다.
let lhs: [Int] = [ ... ]
let rhs: [Int] = [ ... ]
var sum: [Int] = [ ... ]
// lhs와 rhs의 모든 요소가 오버플로 요소가 없고,
// lhs[i] + rhs[i]의 결과가 오버플로가 없다고 확신한다면
// 오버플로 확인을 생략한 &+ 연산자를 사용하여 성능을 개선할 수 있습니다
for i in 0...n {
sum[i] = lhs[i] &+ rhs[i]
}
&+
,&-
,&*
연산자는 오버플로가 발생하면 최상위 비트를 버립니다. 그래서Int.max &+ 1
의 결과값은Int.min
과 같습니다.