我在 Rust 书中遇到了下面的例子。
for &item in list.iter() {
if item > largest {
largest = item;
}
}
Run Code Online (Sandbox Code Playgroud)
我想这意味着list.iter()返回对列表中元素的引用,&item但是在将其与最大数字进行比较时,为什么我们不使用*item?&item另外,当我将第一行中的to更改为时,编译器item强制我在第二行和第三行中使用。*item
我在网上看到了另一个例子。
(0..).map(|x| x * x)
.take_while(|&x| x <= limit)
.filter(|x| is_even(*x))
Run Code Online (Sandbox Code Playgroud)
这里的闭包take_while接受&x但直接使用x,但闭包filter接受x而不引用但传递*x给is_even。
那么这在 Rust 中是如何工作的呢?
Rust 中的一个简单的 3 行 Hello, World 程序会发出一个 280 行的汇编文件,以便打印两个单词。同时,这个程序的纯汇编版本只需要大约 15 行。为什么 Rust 版本那么长?
这是在 Mac OS 上。
hello.rs:
fn main() {
println!("hello world")
}
Run Code Online (Sandbox Code Playgroud)
hello.s(由rustc --emit=asm hello.rs):
.section __TEXT,__text,regular,pure_instructions
.macosx_version_min 10, 7
.private_extern __ZN3std2rt10lang_start17hb4e01c1e588bf694E
.globl __ZN3std2rt10lang_start17hb4e01c1e588bf694E
.p2align 4, 0x90
__ZN3std2rt10lang_start17hb4e01c1e588bf694E:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $32, %rsp
leaq l___unnamed_1(%rip), %rax
movq %rdi, -8(%rbp)
leaq -8(%rbp), %rcx
movq %rcx, %rdi
movq %rsi, -16(%rbp)
movq %rax, %rsi …Run Code Online (Sandbox Code Playgroud) 使用什么算法的内置[T]::sort方法?是否可以查看该方法的代码?
我有两个(相当于?)程序,一个在另一个在Rust中.平均执行时间是:
走
package main
import (
"fmt"
"time"
)
func main() {
work := []float64{0.00, 1.00}
start := time.Now()
for i := 0; i < 100000000; i++ {
work[0], work[1] = work[1], work[0]
}
elapsed := time.Since(start)
fmt.Println("Execution time: ", elapsed)
}
Run Code Online (Sandbox Code Playgroud)
锈
我编译了 --release
use std::time::Instant;
fn main() {
let mut work: Vec<f64> = Vec::new();
work.push(0.00);
work.push(1.00);
let now = Instant::now();
for _x in 1..100000000 {
work.swap(0, 1);
}
let elapsed = now.elapsed();
println!("Execution time: {:?}", elapsed); …Run Code Online (Sandbox Code Playgroud) rust ×4
algorithm ×1
assembly ×1
go ×1
iterator ×1
llvm-codegen ×1
macos ×1
performance ×1
reference ×1
sorting ×1