Rust:如何使用内联inline

内联 (Inlining) :

  • 内联是一种优化技术,它通过将函数的代码直接插入到调用它的地方来减少函数调用的开销。这通常可以提高程序的执行速度,但也可能会增加程序的大小,因为相同的代码可能会在多个地方复制
  • 内联主要通过减少函数调用的开销来优化代码的执行速度。这通常在函数体非常小,调用非常频繁时最为有效。通过使用#[inline]属性,你可以向编译器提示一个函数可能是一个内联的好候选者。下面是一些具体的例子和解释:

基本的内联 :

rust 复制代码
```
rustCopy code
#[inline]
fn add(a: i32, b: i32) -> i32 {
    a + b
}

fn main() {
    let sum = add(5, 7);
    println!("{}", sum);  // Output: 12
}
```

在这个例子中,add函数前面有一个#[inline]属性,提示编译器应该尽量将这个函数内联。如果编译器接受这个提示,它会将add函数的代码直接插入到调用它的地方,从而减少函数调用的开销。

总是内联 :

rust 复制代码
```
rustCopy code
#[inline(always)]
fn always_inline(a: i32, b: i32) -> i32 {
    a + b
}

fn main() {
    let sum = always_inline(5, 7);
    println!("{}", sum);  // Output: 12
}
```

在这个例子中,always_inline函数前面有一个#[inline(always)]属性,它告诉编译器应该总是将这个函数内联,不管它的大小或复杂度。

rust 复制代码
###   从不内联 :

```
rustCopy code
#[inline(never)]
fn never_inline(a: i32, b: i32) -> i32 {
    a + b
}

fn main() {
    let sum = never_inline(5, 7);
    println!("{}", sum);  // Output: 12
}
```

在这个例子中,never_inline函数前面有一个#[inline(never)]属性,它告诉编译器应该从不将这个函数内联。这可能在你不希望某个函数内联,或者想保持函数调用的清晰性时有用。

优劣势:

复制代码
 内联可以减少函数调用的开销,可能会提高程序的运行速度,但也可能会增加代码的大小。过度的内联可能会导致代码膨胀,从而降低缓存的效率。所以,应该谨慎地使用内联,确保它能提高程序的性能而不是降低性能。

默认情况

在 Rust 中,默认情况下,编译器会根据一些因素来决定是否将函数内联,例如优化级别和函数的大小。具体来说,非泛型函数在跨crate的情况下不会被内联,除非使用了链接时优化(Link-Time Optimization,LTO);而泛型函数可能会被内联。这种默认的内联行为可以在一些简单的情况下提供好的效果,例如非常小的函数或只在一个地方被调用的函数,编译器通常会自行决定将这些函数内联,即使没有 #[inline] 属性

在 Rust 中,一个编译单元是一个 crate,如果函数 f 在 crate A 中定义,那么所有从 A 中对 f 的调用都可以被内联,因为编译器可以完全访问 f。但是,如果 f 从某个下游的 crate B 被调用,这些调用就不能被内联,因为 B 只能访问 f 的签名,而不能访问其主体

如果想要制作编译器可以制作的最快的二进制文件,可以/应该使用链接时优化(rustc -C lto),它可以访问 crate 的所有 Rust 依赖项,并且可以内联,包括没有 #[inline] 属性的函数。如果函数是泛型函数(例如,如果在 fn 或 surrounding impl 上有一个或多个类型参数 - 生命周期参数不算),则可以在没有 #[inline] 提示的情况下跨 crate 进行内联 通过使用#[inline]#[inline(always)]#[inline(never)]等属性,开发人员可以为编译器提供内联函数的指南,从而有可能提高程序的性能。

相关推荐
Hello.Reader9 小时前
Rocket Fairings 实战把全局能力做成“结构化中间件”
中间件·rust·rocket
Andrew_Ryan10 小时前
rust arena 内存分配
rust
Andrew_Ryan10 小时前
深入理解 Rust 内存管理:基于 typed_arena 的指针操作实践
rust
微小冷1 天前
Rust异步编程详解
开发语言·rust·async·await·异步编程·tokio
鸿乃江边鸟1 天前
Spark Datafusion Comet 向量化Rust Native--CometShuffleExchangeExec怎么控制读写
大数据·rust·spark·native
明飞19872 天前
tauri
rust
咚为2 天前
Rust tokio:Task ≠ Thread:Tokio 调度模型中的“假并发”与真实代价
开发语言·后端·rust
天天进步20152 天前
Motia性能进阶与未来:从现有源码推测 Rust 重构之路
开发语言·重构·rust
Hello.Reader3 天前
Rocket 0.5 响应体系Responder、流式输出、WebSocket 与 uri! 类型安全 URI
websocket·网络协议·安全·rust·rocket
FreeBuf_3 天前
黑客利用React Native CLI漏洞(CVE-2025-11953)在公开披露前部署Rust恶意软件
react native·react.js·rust