2015-07-20 3 views
4

Что касается const, то rust docs state (курсив мой):Как встроенный массив const?

Константы жить в течение всего жизненного цикла программы. Более конкретно, константы в Rust не имеют фиксированного адреса в памяти. Это потому, что они эффективно привязаны к каждому месту, что они используются. По этой причине ссылки на одну и ту же константу не обязательно гарантируют обращение к одному и тому же адресу памяти.

Итак, мне интересно, как массив констант «эффективно встроен». Смотрите мои комментарии к следующим фрагментом:

const ARR: [i32; 4] = [10, 20, 30, 40]; 

fn main() { 
    // is this 
    println!("{}", ARR[1]); 

    // the same as this? 
    println!("{}", [10, 20, 30, 40][1]); 

    // or this? 
    println!("{}", 20); 
} 

Благодарим за разъяснения!

ответ

5

От этого зависит. Ответ - «все вышеперечисленное, наверное». Давайте изменим ваш пример немного:

const ARR: [i32; 4] = [10, 20, 30, 40]; 

#[inline(never)] fn show(v: i32) { println!("{}", v); } 

fn main() { 
    // is this 
    show(ARR[1]); 

    // the same as this? 
    show([10, 20, 30, 40][1]); 

    // or this? 
    show(20); 
} 

Теперь давайте транслируем это до LLVM IR и увидеть, что функция main выглядит следующим образом:

define internal void @_ZN4main20hf87c9a461739c547ZaaE() unnamed_addr #4 { 
entry-block: 
    call void @_ZN4show20h659b6b1f4f7103c4naaE(i32 20) 
    call void @_ZN4show20h659b6b1f4f7103c4naaE(i32 20) 
    call void @_ZN4show20h659b6b1f4f7103c4naaE(i32 20) 
    ret void 
} 

Три одинаковых вызовы функции show, каждое пропускание постоянный 20. Это даже не с оптимизацией!

С точки зрения того, что гарантирует язык, первые два вызова show семантически идентичны. Утверждение о том, что константа «inlined» не означает, что она автоматически вызывает все вокруг нее, чтобы быть встроенным; это просто приводит к замене значения на месте. Однако из-за агрессивной постоянной сгибания и вставки Rust все три эквивалента на практике, в данном конкретном случае.

+0

Отличный ответ, и очень ценится. Просто повторю, что вы отвечаете - массив const встроен (заменен на месте), как и любой другой const, но ржавчина будет естественным образом оптимизировать литералы с индексированным массивом, заменив его индексированным значением? И хотя последняя оптимизация происходит, она формально не определена как часть спецификации? –

+2

@ w.brian: Я думаю, что самая безопасная вещь - это то, что она может * оптимизировать ее. Как и большинство оптимизаций, они могут не произойти по ряду причин. Возможно, что это так просто * так тривиально *, что LLVM делает это даже при очень низких уровнях оптимизации. Но это может быть не так; насколько я знаю, это * не * гарантировано языком. –

Смежные вопросы