温馨提示×

Linux C++配置内存怎么设

小樊
40
2026-07-31 17:49:59
栏目: 编程语言

在 Linux 下用 C++ 配置/设置内存,常见场景有几种,不同目的配置方式不一样。下面按「最常见 → 进阶」给你系统梳理一下,你可以对照自己的需求来看。


一、程序运行时设置内存(最常见)

1️⃣ 使用 new / malloc 动态分配内存

这是最基础的方式。

int* p = new int[100];        // 分配 100 个 int
delete[] p;
int* p = (int*)malloc(100 * sizeof(int));
free(p);

✅ 适合:普通程序
❌ 不适合:超大内存、实时系统


二、限制程序可用内存(Linux 系统级)

2️⃣ 使用 ulimit 限制内存(临时)

ulimit -v 524288     # 虚拟内存限制 512MB(单位 KB)
ulimit -m 262144     # 物理内存限制 256MB

查看当前限制:

ulimit -a

⚠️ 只对当前 shell 生效。


3️⃣ 使用 cgroups(推荐,服务器/容器)

限制某个进程最多用 500MB 内存:

mkdir /sys/fs/cgroup/memory/test
echo 500M > /sys/fs/cgroup/memory/test/memory.limit_in_bytes
echo $$ > /sys/fs/cgroup/memory/test/cgroup.procs

✅ 适合:服务器、Docker、多进程环境


三、C++ 程序内部“内存配置”(内存池 / 自定义分配器)

4️⃣ 自定义内存分配器(高级)

#include <cstdlib>

void* my_alloc(size_t size) {
    return std::malloc(size);
}

void my_free(void* p) {
    std::free(p);
}

或实现 std::allocator

template<typename T>
class MyAllocator {
public:
    using value_type = T;
    T* allocate(size_t n) {
        return static_cast<T*>(std::malloc(n * sizeof(T)));
    }
    void deallocate(T* p, size_t) {
        std::free(p);
    }
};

✅ 适合:高性能、游戏引擎、数据库


四、调整堆 / 栈内存大小

5️⃣ 栈大小(线程相关)

查看默认栈大小:

ulimit -s

临时修改:

ulimit -s 8192   # 8MB

线程中设置栈大小:

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 8 * 1024 * 1024);

⚠️ 栈太大容易导致内存浪费


五、Linux 内核 & 系统内存参数(服务器)

6️⃣ 调整 overcommit(是否允许超分配)

cat /proc/sys/vm/overcommit_memory

可选值:

  • 0:启发式(默认)
  • 1:总是允许
  • 2:严格限制

临时修改:

sysctl vm.overcommit_memory=2

六、调试 / 查看内存使用

7️⃣ 常用工具

top
htop
cat /proc/<pid>/status
valgrind ./a.out

七、选择建议(快速对照)

需求 推荐方式
普通 C++ 程序 new / malloc
限制程序内存 ulimit / cgroups
高性能内存管理 自定义 allocator
多线程栈 pthread_attr_setstacksize
服务器 cgroups + overcommit

八、如果你愿意,我可以更精确帮你

你可以直接告诉我:

  1. ✅ 是 普通程序 / 服务器 / 嵌入式 / Docker
  2. ✅ 想限制 最大内存 还是 提高性能
  3. ✅ 是 单个进程 还是 多线程

我可以直接给你一份 可复制用的配置示例

0