performance - 使用 'static vs ' a 有什么性能差异?

标签 performance memory rust lifetime

考虑到以下功能,您预计会有哪些性能差异?

pub fn foo<'a>(data: Request) -> Response<'a> {
    //
}

对比

pub fn foo(data: Request) -> Response<'static> {
    //
}

具有 'static 生命周期的 Response 是否会在程序生命周期内将每个 Response 都保存在内存中?

'static 相比,'a 会在内存中保存多长时间?

最佳答案

这两个函数将生成相同的机器码。生命周期在编译期间被删除。如果您的程序 check out ,它们就没有进一步的意义。

特别是,将生命周期视为“这在内存中保存了这么久”是错误的。生命周期就是“这个活得足够长”。这是一个微妙的区别,但要记住的关键是生命周期是描述性的,而不是规定性的。给予某物一生的生命并不意味着它会存活一段时间。要么由于其他原因(例如,可以使用 'static 引用全局变量)它在必要的持续时间内处于事件状态,或者程序将无法编译。

其次,您的代码段中的生命周期根本不会立即生效。它们只是 Response 结构的参数。由该结构决定如何处理生命周期。它是否在内部持有对这一生的事物的引用?它是否只是转发到用于将响应与某个连接相关联的 PhantomData

第三,鉴于函数的定义方式(生命周期参数仅用于返回类型),对实现的要求没有区别。因为这里的生命周期是由调用者选择的,所以函数无论如何都必须准备好完成'static生命周期。所有这一切只会让调用者的使用更加烦人。

总结一下:

  • 生命周期不是这样的。
  • 第一个版本没有用。

关于performance - 使用 'static vs ' a 有什么性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51797033/

相关文章:

java - 优化频繁flush()

c - 分配内存块然后创建内存的逻辑子 block 并返回指向这些子 block 的指针

rust - 多态类型的特殊类型

memory - Rust 如何在数组中存储枚举值?

c++ - 为特定时间快速搜索音符建模音乐(音符)的最佳方式

c - Linux 上的磁盘 IO 模拟器

c++ - 分析永不退出的基于 C 或 C++ 的应用程序

c# - Linq System.OutofMemoryException 异常

c++ - 如何将 Windows SOCKADDR_BTH 的 C++ 转换复制到 Rust 中的 SOCKADDR?

c++ - 字典访问优化描述 - 它发生在任何地方吗?