第二版The Rust Programming Language 声明了以下关于迭代数组的while循环:
fn main() {
let a = [10, 20, 30, 40, 50];
let mut index = 0;
while index < 5 {
println!("the value is: {}", a[index]);
index = index + 1;
}
}
Run Code Online (Sandbox Code Playgroud)
[...]它也很慢,因为编译器添加了运行时代码,通过循环对每次迭代的每个元素执行条件检查.
作为一种更有效的替代方法,您可以使用for循环并为集合中的每个项执行一些代码.
fn main() {
let a = [10, 20, 30, 40, 50];
for element in a.iter() {
println!("the value is: {}", element);
}
}
Run Code Online (Sandbox Code Playgroud)
在C++中,我希望编译器/优化器能够生成具有相同运行时性能的东西.
为什么Rust不是这样的?
Mat*_* M. 11
在C++中,我希望编译器/优化器能够生成具有相同运行时性能的东西.
因为这两个片段不相同.使用a[i]Rust映射到Rust映射到C++中a.at(i)的用法.unsafe { a.get_unchecked(i) }a[i]
也就是说,C++ 默认情况下不执行边界检查,这就是缓冲区溢出的方式.
为什么Rust不是这样的?
不使用unsafe关键字时,Rust 应该是内存安全的.在许多情况下,这是通过编译时检查实现的,但边界检查通常需要运行时检查.
这并不意味着while案例总是会慢一些:它只是意味着你将自己提交给优化器的一时兴起,有时它会让你失望(消除边界检查是一个难题).
因此,建议使用已知可以很好地优化的习语.
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |