È possibile utilizzare lazy-static per inizializzare l'array statico al primo accesso, anche se potrebbe comportare un sovraccarico minimo (sembra richiamare Once::call_once ogni volta che si accede alla variabile statica).
Per esempio, Cargo.toml:
[package]
name = "arr"
version = "0.0.1"
[[bin]]
name = "arr"
path = "arr.rs"
[dependencies]
lazy_static = "*"
arr.rs:
#[macro_use]
extern crate lazy_static;
use std::mem;
use std::ptr;
#[derive(Debug)]
struct Mbuf {
cacheline: *mut u64,
}
// Let's pretend it's thread-safe to appease the lazy_static! constrains.
unsafe impl Sync for Mbuf { }
lazy_static! {
static ref ARR: [Mbuf; 32] = {
let mut tmp: [Mbuf; 32] = unsafe { mem::uninitialized() };
for idx in 0..tmp.len() {
tmp[idx] = Mbuf { cacheline: ptr::null_mut() };
}
tmp
};
}
fn main() {
println!("{:?}", *ARR);
}
In alternativa, basta fare il vostro proprio di accesso pigro:
use std::mem;
use std::ptr;
#[derive(Debug)]
struct Mbuf {
cacheline: *mut u64,
}
static mut ARR: Option<[Mbuf; 32]> = None;
fn arr() -> &'static mut [Mbuf; 32] {
unsafe {
if ARR.is_none() {
let mut tmp: [Mbuf; 32] = mem::uninitialized();
for idx in 0..tmp.len() {
tmp[idx] = Mbuf { cacheline: ptr::null_mut() };
}
ARR = Some(tmp);
}
mem::transmute(ARR.as_mut().unwrap())
}
}
fn main() {
println!("{:?}", arr());
}
Inutile dire che questo codice non è thread-safe e quindi evita alcune delle garanzie di sicurezza di Rust, ma per una porta di confronto della velocità è sufficiente.
Bene sicuramente vuoi usare le variabili, e sicuramente non vuoi lasciarle non inizializzate. Quindi, che cosa vuoi? – delnan
Voglio inizializzare e lavorare con tali variabili in main. Riscrivo l'applicazione С per verificare la sua velocità nella ruggine. Quindi ho bisogno di avere un design dell'architettura simile. Anche io sono principiante in ruggine :) – maki