c - 为什么 sbrk() 不告诉我正在使用多少堆?

标签 c memory

我有一个游戏引擎,我想快速查看它使用了多少堆,所以我实现了这两个小例程

static void * start_memory = 0;
unsigned long System::memoryUsage(){
    void * here = sbrk(0);
    return (char*) here - (char*) start_memory;
}

void System::startMemoryUsage(){
    start_memory = sbrk(0);
}

我很早就在 main() 中调用了 startMemoryUsage()。当我在运行时使用它时,我通常会看到相对较低的值,例如 300kb,但顶部显示 RSS 大约为 30mb。为什么我没有从 sbrk() 获得准确的测量结果?

我猜这与线程有关。游戏引擎生成 5 个线程(+ 主线程总共 6 个),用于处理输入和音乐等事务。难道主线程确实使用了 300kb,但其他线程总共使用了 30mb?

最佳答案

sbrk(0) 仅告诉您数据段的末尾在哪里。 malloc() 不仅可以通过扩展数据段来获取内存,还可以通过调用 mmap() 进行更大的分配来获取内存。另外,由于您正在使用多个线程,因此其他线程的其他区域也可能被映射。

关于c - 为什么 sbrk() 不告诉我正在使用多少堆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7862884/

相关文章:

c - 通过 C 语言的套接字快速接收不同长度数据包的连续流?

c - 最快的多线程排序方法

c - 我的日期代码有问题吗?

c - 内存碎片

c - c 中这个简单的 printf 输出背后的真正含义是什么?

c++ - 找出结构的内存消耗

c - 是否可以将结构存储到链表中?

c - 内存映射文件无法在不取消映射的情况下关闭,因为它仍然被引用

python - 如何控制我的进程可用的可用内存(以防止出现 MemoryError)

c# - 非托管内存泄漏