2017-04-16 23 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

這根本不是編譯時常數。使用vec!對於任何不能確定編譯時間:

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

目前有可變長度陣列(VLA)沒有編譯器級別的支持。

+0

好的,這不是編譯時常量。文件也這樣說。有沒有其他方式可以一次讀取頁面大小並在任何地方使用?有沒有辦法將頁面大小寫入真正的編譯時常量? '靜態PAGE_SIZE:i64 = ...'也許?什麼? –

+1

你可以通過一個編譯器插件或者'env!'編譯腳本來實現。我不推薦在堆棧上分配,因爲在堆棧上分配頁面可能會導致溢出。 –

+1

@TatsuyukiIshi:我想說明的是,在* cross-compiling *的情況下,應該謹慎使用構建腳本和'env!'。目標系統和主機系統可能有不同的頁面大小。因此,我會建議使用'cfg'。 –