内存布局与对齐
学习目标
- 理解结构体内存布局
- 掌握对齐规则
- 优化内存使用
核心概念
结构体大小
use std::mem;
struct A {
a: u8,
b: u32,
c: u8,
}
struct B {
a: u8,
c: u8,
b: u32,
}
fn main() {
println!("A: {} bytes", mem::size_of::<A>());
println!("B: {} bytes", mem::size_of::<B>());
}
对齐规则
use std::mem;
fn main() {
println!("u8 对齐: {}", mem::align_of::<u8>());
println!("u32 对齐: {}", mem::align_of::<u32>());
println!("u64 对齐: {}", mem::align_of::<u64>());
}
repr 属性
#[repr(C)]
struct CLayout {
a: u8,
b: u32,
}
#[repr(packed)]
struct Packed {
a: u8,
b: u32,
}
#[repr(align(64))]
struct CacheAligned {
data: [u8; 64],
}
Box vs Vec
use std::mem;
fn main() {
let boxed: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();
println!("Box<[i32]>: {} bytes", mem::size_of_val(&*boxed));
let vec: Vec<i32> = vec![1, 2, 3];
println!("Vec<i32>: {} bytes", mem::size_of::<Vec<i32>>());
}
String vs &str
use std::mem;
fn main() {
println!("String: {} bytes", mem::size_of::<String>());
println!("&str: {} bytes", mem::size_of::<&str>());
}
小结
| 类型 | 大小 | 说明 |
|---|
u8 | 1 | 对齐 1 |
u32 | 4 | 对齐 4 |
u64 | 8 | 对齐 8 |
String | 24 | ptr + len + cap |
Vec<T> | 24 | ptr + len + cap |
Box<T> | 8 | 指针 |
&T | 8 | 指针 |
&str | 16 | ptr + len |