我正在处理 Rust 中的大量数据,在评估数据结构的内存使用情况时,我偶然发现了一些令人惊讶的结果。
首先,我尝试通过将零推入其中来手动填充向量:
let mut arr = vec![];
for _ in 0..(4_294_967_294 as u32) {
arr.push(0);
}
Run Code Online (Sandbox Code Playgroud)
一段时间后,不出所料,我会说,我的计算机耗尽了可用内存,并且该进程被操作系统终止了。
但是,如果我使用宏初始化来初始化向量,行为会发生变化:
let mut arr = vec![0; 2_147_483_647_000];
for i in 1..1_000_000_000 {
arr[i-1] = rng.next_u64();
let sample = rng.next_u32();
let res = arr[sample as usize];
if i % 10000000 == 0 {
print!("After {} ", i);
print!("Btw, arr[{}] == {} ", sample, res);
print_allocated_memory();
}
}
Run Code Online (Sandbox Code Playgroud)
尽管我用实际的 u64 值填充了 10 亿个条目,并从数组中读出了随机值(大部分是零,我只是试图在此处排除整个数组的编译器优化),但我的计算机内存并没有溢出。
内存使用情况jemalloc如下(请注意,我的计算机仅安装了 16 GB RAM):
allocated 16777216.05 MiB resident …Run Code Online (Sandbox Code Playgroud) 为什么打印32767(或其他随机数)?什么是std::cout印刷品?为什么不NULL(或0)?
int main()
{
int a;
std::cout << a;
}
Run Code Online (Sandbox Code Playgroud)