第五节 · 瞬移术 · 右值引用与对象移动

在资源受限的环境或高性能场景中,合理管理内存至关重要。这一节我们探讨一些实用的内存优化技巧。


减少内存分配

// 不好:频繁分配
void bad()
{
    for (int i = 0; i < 1000; ++i)
    {
        string s = "Hello";  // 每次都分配
        // 处理 s
    }
}

// 好:复用对象
void good()
{
    string s;
    for (int i = 0; i < 1000; ++i)
    {
        s = "Hello";  // 可能复用内存
        // 处理 s
    }
}

预分配容量


收缩容器


移动语义避免复制


使用合适的数据结构

需求
选择
原因

随机访问多

vector

连续内存,缓存友好

中间插删多

list

O(1) 插删

频繁查找

unordered_set/map

O(1) 查找

有序且查找

set/map

O(log n) 查找

固定大小

array

无堆分配


结构体内存布局


位域节省空间


小字符串优化(SSO)


对象池模式


内存映射文件

处理大文件时,可以使用内存映射而不是读取到内存。


测量内存使用


习题

  • 优化一个结构体的内存布局。

  • 比较 vector::reserve() 前后的性能差异。

  • 实现一个简单的内存池。

Last updated