Каковы различия в производительности при использовании "статического против" а?

С учетом приведенных ниже функций, какие различия в производительности вы ожидаете?

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 Жизнь в любом случае. Все это делает использование более раздражающим для вызывающего абонента.

Итак, подведем итог:

  • Времена жизни не работают таким образом.
  • Первая версия не полезна.
Другие вопросы по тегам