Каковы различия в производительности при использовании "статического против" а?
С учетом приведенных ниже функций, какие различия в производительности вы ожидаете?
pub fn foo<'a>(data: Request) -> Response<'a> {
//
}
против
pub fn foo(data: Request) -> Response<'static> {
//
}
Будет ли Response
имея всю жизнь 'static
держать каждый Response
в памяти на всю жизнь программы?
Как долго будет 'a
быть в памяти против 'static
?
1 ответ
Две функции будут генерировать идентичный машинный код. Время жизни удаляется во время компиляции. Если ваша программа проверена, они больше не имеют смысла.
В частности, неправильно думать о жизнях, как о том, что "это хранится в памяти так долго". Время жизни - это все, что "это остается в живых достаточно долго". Это тонкое различие, но главное, что нужно помнить, это то, что время жизни носит описательный, а не предписывающий характер. Давать что-то на всю жизнь не означает, что оно остается живым в течение определенного периода времени; либо он жив в течение необходимой продолжительности по другим причинам (например, на глобальную переменную можно ссылаться с помощью 'static
), или программа не скомпилируется.
Во-вторых, время жизни в ваших фрагментах не оказывает никакого непосредственного влияния вообще. Они просто параметры для Response
структура. Это зависит от этой структуры, чтобы решить, что делать с жизнью. Содержит ли это внутреннюю ссылку на что-то с этой жизнью? Это просто отправлено PhantomData
раньше ассоциировали ответ с каким-то соединением?
В-третьих, учитывая способ определения функции (с параметром времени жизни, используемым только в возвращаемом типе), нет различий в требованиях к реализации. Поскольку время жизни здесь выбирается вызывающей стороной, функция должна быть готова выполнить 'static
Жизнь в любом случае. Все это делает использование более раздражающим для вызывающего абонента.
Итак, подведем итог:
- Времена жизни не работают таким образом.
- Первая версия не полезна.