Преобразования во время компиляции

fn main() {

    let var = "hello".to_string(); <- Преобразование &str в String

    let var = "hello".as_bytes(); <- Преобразование &str в [u8]

}

Выполнятся ли эти преобразования на этапе компиляции или только при запуске программы?


Ответы (1 шт):

Автор решения: Pavel Mayorov

Вообще говоря, такие вопросы не вполне корректны. Программы, написанные на языке rust, считаются выполняющимися на абстрактной rust-машине, и в рамках этой машины нет никакого разделения на "время компиляции" и "время выполнения".

Задачей же компилятора является написать такую программу в машинных кодах целевой платформы, которая будет вести себя неотличимо от заданной на вход программы, выполняющейся в той самой rust-машине. Что при этом он будет делать во время компиляции, а что оставит на время выполнения - дело компилятора.


Тем не менее, ваш вопрос вполне понятен. Как правило, программы пишутся с расчётом не на абстрактный интерпретатор в вакууме, а на конкретный компилятор, который умеет производить весьма конкретные оптимизации.

Так вот, для выяснения подобных вопросов существует сервис Compiler Explorer, и вот что он показывает для вашего примера (https://rust.godbolt.org/z/9x4T8YMh8):

Вызов .as_bytes() не требует никакой хитрой работы, и компилятор избавился от него полностью.

Вызов .to_string() требует выделения памяти в куче, и с этим выделением компилятор ничего не смог поделать: оно осталось в рантайме. Однако, компилятор устранил сам вызов .to_string(), раскрыв его

→ Ссылка