Rust中原始数组的len
方法的运行时复杂性是多少?我知道它对于Vector
和String
来说是不变的,但是每种类型都会记录它们的长度,而且我找不到关于数组是否属于这种情况的任何文档。
答案 0 :(得分:6)
原始数组具有恒定长度,因此可以安全地假设在编译期间可以计算数组的大小(编译时常量)
假设:
let array = [1, 2, 3, 4, 5];
println!("Length: {}", array.len());
调试版本给出:
callq alloc::slice::<impl [T]>::len
movq %rax, -16(%rbp)
movq core::fmt::num::<impl core::fmt::Display for usize>::fmt@GOTPCREL(%rip), %rsi
调试版本似乎将责任委托给切片的len
方法。
但是,正如预期的那样,发布版本会在编译期间计算一个常量,将其直接推入堆栈并使用它:
movq $5, (%rsp)
movq core::fmt::num::<impl core::fmt::Display for usize>::fmt@GOTPCREL(%rip), %rax