2016-09-13 10 views
4

、我々は戻り値の最適化を忘れて、次のコードがある場合:領域ベースのメモリ管理を使用するRustですか?例えば

fn func() -> Box<String> { 
    Box::new(String::new()) 
} 

fn main() { 
    let boxed_string = func(); 
} 

コンパイラがメモリを管理するための領域を作成するのか、それが通常のヒープ割り当てを使うのでしょうか?

私はこの単純なコードが最適化されている可能性がありますが、より複雑なコードではそうではない可能性があります。

答えて

10

領域ベースのメモリ管理と同じ意味で、ライフタイムは「領域」と呼ばれることがありますが、Rustはではありません。は自動的にメモリに基づいてメモリを管理します。ライフタイムは静的解析にのみ使用されます。メモリは通常の方法で割り当てられます— クレートのように手動で実装されている場合はメモリプールのような他の抽象的な可能性のあるレジスタ、スタック、ヒープ(一部のCスタイルのmalloc関数)が考えられます。この完全に通常のメモリ管理は、領域の概念を使用してコンパイラによって解析されますが、実行時の動作にはまったく影響しません。実際には、マシンコードが生成される前に、プログラムからの寿命が消去されます。

ただし、の移動がコードに追加されている可能性があります。 Box::newは、引数が移動される通常の関数であり、同様にString::newの戻り値は移動を伴う可能性があります。

+1

あなたの答えをありがとう。これはどこに文書化されていますか? – antoyo

+3

GCCがすべてのプログラムにガベージコレクタをリンクしていないことがどこに書かれているのか分かりません。それはちょうど...一般的な知識なので、言いたいことです。 – delnan

+0

@antoyo:これは私が知る限り文書化されていませんが、放出されたLLVM IRをいつでもチェックアウトすることができます(アセンブリより読みやすいと思います)。 –

関連する問題