आप पहले पहुंच पर स्थैतिक सरणी शुरू करने के लिए lazy-static का उपयोग कर सकते हैं, भले ही इसमें न्यूनतम ओवरहेड हो सकता है (ऐसा लगता है कि हर बार जब आप स्थिर चर का उपयोग करते हैं तो Once::call_once का आह्वान होता है)।
उदाहरण के लिए, Cargo.toml:
[package]
name = "arr"
version = "0.0.1"
[[bin]]
name = "arr"
path = "arr.rs"
[dependencies]
lazy_static = "*"
arr.rs:
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());
}
:
#[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);
}
वैकल्पिक रूप से, बस अपनी स्वयं आलसी एक्सेसर बनाने
कहने की जरूरत नहीं है, यह कोड थ्रेड-सुरक्षित नहीं है और इस प्रकार जंग की सुरक्षा गारंटीओं में से कुछ को बंद कर देता है, लेकिन गति तुलना पोर्ट के लिए यह पर्याप्त होगा।
निश्चित रूप से आप चर का उपयोग करना चाहते हैं, और निश्चित रूप से आप उन्हें अनियमित नहीं छोड़ना चाहते हैं। तो तुम क्या चाहते हो? – delnan
मैं मुख्य रूप से ऐसे चर के साथ प्रारंभ करना और काम करना चाहता हूं। मैं जंग में इसकी गति की जांच करने के लिए एस एप्लिकेशन को फिर से लिखता हूं। तो मुझे समान वास्तुकला डिजाइन होना चाहिए। इसके अलावा मैं जंग में शुरुआत कर रहा हूँ :) – maki