Влияет ли время жизни Rust на семантику скомпилированной программы?
Я пытаюсь уловить времена жизни в Rust и спрашиваю себя, являются ли они "просто" мерой безопасности (и способом сообщить, как обеспечивается безопасность, или нет, в случае ошибок) или есть случаи, когда разные варианты выбора время жизни фактически меняет способ работы программы, т. е. имеет ли время жизни семантическое значение для скомпилированной программы.
А с "жизнями" я имею в виду все надоедливые маленькие 'a
, 'b
, 'static
маркеры, которые мы включили, чтобы осчастливить контролера заимствования Конечно, написание
{
let foo = File::open("foo.txt")?;
}
foo.write_all(b"bar");
вместо
let foo = File::open("foo.txt")?;
foo.write_all(b"bar");
закроет файловый дескриптор до того, как произойдет запись, даже если впоследствии мы сможем получить доступ к foo, но такого рода определение области действия и вызов деструктора также происходит в C++.
1 ответ
Нет, время жизни никак не влияет на сгенерированный машинный код. В конце концов, все это "просто указатели" на скомпилированный код.
Поскольку мы - люди, говорящие на человеческом языке, мы склонны объединять две разные, но взаимосвязанные концепции: конкретные времена жизни и общие параметры времени жизни.
Все языки программирования имеют конкретные времена жизни. Это просто соответствует тому, когда ресурс будет выпущен. Это то, что показывает ваш пример, и действительно, C++ работает так же, как и Rust. Это часто известно как Инициализация Ресурса - Инициализация (RAII). Языки, собираемые мусором, тоже имеют время жизни, но их может быть сложнее зафиксировать точно, когда они закончатся.
Что делает Rust аккуратным в этой области, так это общие параметры времени жизни, вещи, которые мы знаем как 'a
или же 'static
, Это позволяет компилятору отслеживать базовые указатели, так что программисту не нужно беспокоиться, будет ли указатель оставаться действительным достаточно долго. Это работает для хранения ссылок в структурах и передачи их в функции и из функций.