2017-04-16 8 views
0

次のコードでは、ページサイズをsysconfからファイルシステムのファイルを最適に読み取るようにしています。私はサイズのバッファを作成することができません:配列のサイズにレイジー静的整数定数を使用できません

lazy_static! { 
    static ref PAGE_SIZE: i64 = sysconf(SysconfVariable::ScPagesize).unwrap(); 
} 

fn main() { 
    let mut buffer = [0; *PAGE_SIZE as usize]; 
} 

は私を与える:

error[E0080]: constant evaluation error 
    --> src/main.rs:6:30 
    | 
6 |   let mut buffer = [0; *PAGE_SIZE as usize]; 
    |        ^^^^^^^^^^ unimplemented constant expression: deref operation 

私はそれがオペレータの優先順位の問題で考えて、それをラップしようとしたブレースが、結果は同じ。

error[E0080]: constant evaluation error 
    --> src/main.rs:6:30 
    | 
6 |   let mut buffer = [0; (*(PAGE_SIZE)) as usize]; 
    |        ^^^^^^^^^^^^^^ unimplemented constant expression: deref operation 

バッファの割り当てに上記の定数を使用するにはどうすればよいですか?

答えて

2

これはコンパイル時定数ではありません。

let mut buffer = vec![0; *PAGE_SIZE as usize]; 

は現在、可変長配列(VLA)には、コンパイラレベルのサポートはありません。コンパイル時に決定することはできません何のためにvec!を使用してください。

+0

これはコンパイル時定数ではありません。ドキュメントもそう言います。ページサイズを一度読み取ってどこにでも使用できる他の方法はありますか?ページサイズを実際のコンパイル時定数に書き込む方法はありますか? 'static PAGE_SIZE:i64 = ...'おそらく?何か? –

+1

これは、コンパイラプラグイン、または 'env!'と組み合わされたビルドスクリプトによって実現できます。スタックにページを割り当てるとオーバーフローが発生する可能性があるため、スタックに割り当てることをお勧めできません。 –

+1

@ TatsuyukiIshi:ビルドスクリプトと 'env!'の使用は、*クロスコンパイル*の際に注意深く行うべきです。ターゲット・システムとホスト・システムのページ・サイズが異なる場合があります。したがって、代わりに 'cfg'を使うことを提案します。 –

関連する問題