sup*_*_jh 0 symbols elf segment rust lazy-static
以下 Rust 代码,在 x86_64 平台编译。
#[macro_use]
extern crate lazy_static;
use std::collections::HashMap;
lazy_static! {
static ref HASHMAP: HashMap<u32, &'static str> = {
let mut m = HashMap::new();
m.insert(0, "foo");
m.insert(1, "bar");
m.insert(2, "baz");
m
};
}
fn main() {
// First access to `HASHMAP` initializes it
println!("The entry for `0` is \"{}\".", HASHMAP.get(&0).unwrap());
// Any further access to `HASHMAP` just returns the computed value
println!("The entry for `1` is \"{}\".", HASHMAP.get(&1).unwrap());
}
Run Code Online (Sandbox Code Playgroud)
我使用readelf命令查看符号表中HASHMAP变量的大小:
readelf -sW target/debug/deps/section_test-4d7d6a03c56fdde3.o
Symbol table '.symtab' contains 590 entries:
Num: Value Size Type Bind Vis Ndx Name
452: 0000000000000000 0 OBJECT LOCAL DEFAULT 498 _ZN12section_test7HASHMAP17hbc6de818c577d166E
Run Code Online (Sandbox Code Playgroud)
我们可以看到大小为0。
readelf -SW target/debug/deps/section_test-4d7d6a03c56fdde3.o
There are 527 section headers, starting at offset 0x98690:
Section Headers:
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[498] .rodata._ZN12section_test7HASHMAP17hbc6de818c577d166E PROGBITS 0000000000000000 00b528 000000 00 A 0 0 1
Run Code Online (Sandbox Code Playgroud)
我们看一下符号所在的section,符号位于rodata节中并且该节的Size也为0。
既然长度为0,是不是意味着不能存储数据了,运行时HashMap内存分配到哪里了呢?C语言的符号表中可以定义长度为0的变量吗?
lazy_static
创建一个空类型和值,相当于:
struct HASHMAP { __private_field: ()}
static HASHMAP: HASHMAP = HASHMAP { __private_field: () }
Run Code Online (Sandbox Code Playgroud)
(源代码)
然后它实现了Deref
这种类型,以便在您第一次尝试访问它时可以动态初始化实际值(实际值隐藏在由 调用的私有函数内的静态值中deref
)。
HashMap
顺便说一句,请注意,初始化时,键和值将被分配并存储在堆上,只有HashMap
结构本身位于隐藏的静态值中。
归档时间: |
|
查看次数: |
61 次 |
最近记录: |