内存布局与对齐
学习目标
- 理解结构体内存布局
- 掌握对齐规则
- 优化内存使用
核心概念
结构体大小
use std::mem;
struct A {
a: u8, // 1 byte
b: u32, // 4 bytes
c: u8, // 1 byte
}
struct B {
a: u8, // 1 byte
c: u8, // 1 byte
b: u32, // 4 bytes
}
fn main() {
println!("A: {} bytes", mem::size_of::<A>()); // 12 bytes (有填充)
println!("B: {} bytes", mem::size_of::<B>()); // 8 bytes (更紧凑)
}
对齐规则
use std::mem;
fn main() {
// 对齐 = min(类型大小, 平台最大对齐)
println!("u8 对齐: {}", mem::align_of::<u8>()); // 1
println!("u32 对齐: {}", mem::align_of::<u32>()); // 4
println!("u64 对齐: {}", mem::align_of::<u64>()); // 8
// 字段按对齐大小排列可以减少填充
}
repr 属性
#[repr(C)] // 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() {
// Box<[T]>: 固定大小,堆分配
let boxed: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();
println!("Box<[i32]>: {} bytes", mem::size_of_val(&*boxed));
// Vec<T>: 动态大小,ptr + len + cap
let vec: Vec<i32> = vec![1, 2, 3];
println!("Vec<i32>: {} bytes", mem::size_of::<Vec<i32>>()); // 24 bytes
}
String vs &str
use std::mem;
fn main() {
// String: ptr + len + cap = 24 bytes
println!("String: {} bytes", mem::size_of::<String>());
// &str: ptr + len = 16 bytes
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 |
练习编辑器
rust
Loading...