Преобразования во время компиляции
fn main() {
let var = "hello".to_string(); <- Преобразование &str в String
let var = "hello".as_bytes(); <- Преобразование &str в [u8]
}
Выполнятся ли эти преобразования на этапе компиляции или только при запуске программы?
Ответы (1 шт):
Вообще говоря, такие вопросы не вполне корректны. Программы, написанные на языке rust, считаются выполняющимися на абстрактной rust-машине, и в рамках этой машины нет никакого разделения на "время компиляции" и "время выполнения".
Задачей же компилятора является написать такую программу в машинных кодах целевой платформы, которая будет вести себя неотличимо от заданной на вход программы, выполняющейся в той самой rust-машине. Что при этом он будет делать во время компиляции, а что оставит на время выполнения - дело компилятора.
Тем не менее, ваш вопрос вполне понятен. Как правило, программы пишутся с расчётом не на абстрактный интерпретатор в вакууме, а на конкретный компилятор, который умеет производить весьма конкретные оптимизации.
Так вот, для выяснения подобных вопросов существует сервис Compiler Explorer, и вот что он показывает для вашего примера (https://rust.godbolt.org/z/9x4T8YMh8):
Вызов .as_bytes() не требует никакой хитрой работы, и компилятор избавился от него полностью.
Вызов .to_string() требует выделения памяти в куче, и с этим выделением компилятор ничего не смог поделать: оно осталось в рантайме. Однако, компилятор устранил сам вызов .to_string(), раскрыв его