使用'静态vs'a有什么性能差异?

Jac*_*ser 2 memory performance lifetime rust

考虑到以下功能,您期望的性能差异是什么?

pub fn foo<'a>(data: Request) -> Response<'a> {
    //
}
Run Code Online (Sandbox Code Playgroud)

pub fn foo(data: Request) -> Response<'static> {
    //
}
Run Code Online (Sandbox Code Playgroud)

请问Response有一生'static保持每个Response在内存中的程序的生命?

'a在记忆中会持续多长时间'static

Seb*_*edl 8

这两个函数将生成相同的机器代码.在编译期间删除生命周期.如果您的程序签出,它们没有其他意义.

特别是,将生命时间视为"长期存在于记忆中"是错误的.一生都是关于"这足够长寿".这是一个微妙的区别,但要记住的关键是生命时间是描述性的,而不是规定性的.给予一生一世并不意味着它在一定时间内保持活力; 由于其他原因(例如可以引用全局变量'static),它是否存活了必要的持续时间,或者程序将无法编译.

其次,你的片段中的生命周期根本没有立竿见影的效果.它们只是Response结构的参数.由该结构决定如何处理生命周期.它是否在内部持有对此生命的引用?它只是转发到PhantomData用于将响应与某些连接相关联吗?

第三,给定定义函数的方式(使用仅在返回类型中使用的lifetime参数),对实现的要求没有区别.因为这里的生命周期是由调用者选择的,所以函数必须准备好以实现'static生命周期.所有这一切都使得调用者的使用更加烦人.

总结一下:

  • 一生都不会这样.
  • 第一个版本没用.