93·性能优化高级

内存布局与对齐

内存布局与对齐

学习目标

  1. 理解结构体内存布局
  2. 掌握对齐规则
  3. 优化内存使用

核心概念

结构体大小

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>());
}

小结

类型大小说明
u81对齐 1
u324对齐 4
u648对齐 8
String24ptr + len + cap
Vec<T>24ptr + len + cap
Box<T>8指针
&T8指针
&str16ptr + len

练习编辑器

rust
Loading...