4 days ago
- 许多流行语言(C、C#、Go、Swift)默认使用有符号的int类型,导致程序员较少考虑无符号类型。
- Rust对所有整数类型都明确指定大小(如i32、u64),没有默认的int类型,迫使开发者进行有意的类型选择。
- Rust使用usize作为大小和索引类型,这可以防止负数组索引并支持大数组,但整数字面量默认是i32。
- 在C语言中,有符号整数溢出属于未定义行为,允许编译器进行优化(例如省略溢出检查),而无符号溢出则会自动回绕。
- Chandler Carruth的例子表明,在64位架构上,使用有符号索引可以避免额外的回绕指令,从而提升性能。
- 支持有符号索引的理由包括:便于构建循环(如递减到零)、易于检测无效减法(下溢产生负数)以及简化边界检查。
- 无符号下溢可能静默产生大数,使错误难以捕捉;而有符号整数配合断言使用则提供了更安全的折衷方案。
- 在64位平台上,使用有符号的isize/ptrdiff_t作为索引只会损失一位的范围,这在实践中可以忽略。
- 作者总结认为,采用回绕溢出的有符号整数并加入宽松断言,是在性能与安全性之间的一种实用折衷。
- 像Odin这样的语言使用地址大小的int作为索引和大小类型,避免了将32位整数与指针混用可能导致的性能问题。