2017-04-16 51 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'。 –