gpt4 book ai didi

c++ - 如何强制清除 STL 内存缓存?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:46 26 4
gpt4 key购买 nike

我有一个类,它有一个 unordered_map 类型的字段。我在我的应用程序中创建了该对象的单个实例,它被包装在 shared_ptr 中。该对象非常耗费内存,我想在使用完后立即将其删除。然而,重置指针只是释放了对象占用的一小部分内存。如何强制程序释放对象占用的所有内存?

以下模拟程序重现了我的问题。 for 循环打印垃圾只是为了让我有足够的时间观察 top 使用的内存。析构函数在 reset() 之后被调用。此外,紧接着,使用的内存从大约 2 GB 下降到 1.5 GB。

#include <iostream>
#include <memory>
#include <unordered_map>

using namespace std;

struct A {
~A() {
cerr << "Destructor" << endl;
}

unordered_map<int, int> index;
};

int main() {
shared_ptr<A> a = make_shared<A>();
for (size_t i = 0; i < 50000000; ++i) {
a->index[2*i] = i + 3;
}

// Do some random work.
for (size_t i = 0; i < 3000000; ++i) {
cout << "First" << endl;
}

a.reset();

// More random work.
for (size_t i = 0; i < 3000000; ++i) {
cout << "Second" << endl;
}
}

编译器:g++ 4.6.3。

最佳答案

GCC 的标准库没有“STL 内存缓存”,在其默认配置中(几乎每个人都使用)std::allocator 只是调用 newdelete ,它只调用了 mallocfreemalloc 实现(通常来自系统的 C 库)决定是否将内存返回给操作系统。除非您在没有虚拟内存的嵌入式/受限系统上(或者您已关闭过度提交),否则您可能不想返回它——让库做它想做的事。

操作系统不需要内存回收,它可以毫无问题地为其他应用程序分配千兆字节的虚拟内存。每当人们认为他们需要归还内存时,通常是因为他们不了解现代操作系统如何处理虚拟内存。

如果您真的想强制 C 库将内存返回给操作系统,C 库可能会提供非标准的 Hook 来执行此操作,例如,对于 GNU libc,您可以调用 malloc_trim(0)强制将最顶层的空闲内存块返回给操作系统,但这可能会使您的程序在下次需要分配更多内存时变慢,因为它必须从操作系统中取回它。有关详细信息,请参阅 https://stackoverflow.com/a/10945602/981959(以及那里的其他答案)。

关于c++ - 如何强制清除 STL 内存缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17199554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com