低内存系统上的c++.标准库使用了所有的内存

c++ on low memory systems. Standard libs are using all the memory!

本文关键字:内存 标准 系统 c++      更新时间:2023-10-16

我需要尽可能地减少内存。我使用标准c++与STL。这个程序(还)没有做很多事情,它仍然需要960Kb[根据top]!可执行文件的大小只有64KB。

代码是3000行长,我不打算张贴明显。我认为问题不在于我的代码,而在于系统库。

一个main()函数(包括我所有的代码,但不使用它)使用732Kb的RAM!
简单代码:

int main() {
sleep(1000); //do nothing
return 0;
}
//Uses 732kb of RAM

我的代码中没有全局变量(除了库中对我隐藏的变量)。

我使用标准库:libstdc++ (STL), GNU libc。还有一个BSD套接字和libbev以及非标准STL rope类。

是否有我可以运行的内存分析器?

平台: Linux 2.6.18-32, 32位处理器,16MB总系统内存,不可交换
编译器: GCC 4
标准库: GCC的libstdc++
编译选项: -Os(无调试符号)

我是而不是大量使用模板:容器和迭代器,仅此而已。然而,我正在大量使用SGI STL绳索类。

测试环境是一个基本的服务器,运行Linux 128MB RAM, Pentium III 667 Mhz, CentOS 5.5,没有仿真。

UPDATE:我想知道库本身(代码大小)是否导致问题。共享库不需要加载到RAM中吗?

开始剥离功能,直到内存使用量下降。先走极端——如果你可以用sleep(1000);代替main,而你的内存使用量仍然很高,看看代码和静态数据——在全局范围内初始化的任何东西,或者类或函数内部的静态数据,以及不同类型和调试符号的模板实例化。

UPDATE:删除关于STL分配器的错误注释。它可能适用于其他编译器/STL版本(如果你想看到它,请检查历史记录),但它不适用于这个问题。

请注意,malloc/operator new通常会吝啬于将空闲内存交还给操作系统,这将导致您的程序作为一个整体不会随着时间的推移而减少其明显的使用量;这些内存将通过将来的分配在整个程序中被重用,所以除了将"内存使用"数字无限期地保持在或接近其高水位标记之外,这通常不是一个大问题。

更新:我想知道是否库本身(代码大小)是造成问题。不共享库需要被加载到内存吗?

宾果。至少在Mac OS X上,Top包含了物理内存使用中共享库的大小。当然,每个库只有一个副本驻留在内存中。

检查top的文档以获得解决方法,或者干脆丢弃它并使用malloc_info()。不过,要注意找到一种方法来考虑代码、堆栈和全局使用。

让链接器发出一个链接映射文件;您可以使用它来确定代码需要多少静态链接代码和静态数据空间。

堆栈空间、堆空间和共享库是附加的,在运行时分配。

如果你有16Mb的RAM真的很重要吗?很可能会有相对较大但固定的开销,并且您的总体内存占用不会随着添加的代码行数线性增长。

由于目标是linux,我认为您可以通过查看/proc/{pid_number}

中的map和smaps文件来了解内存使用的细节,特别是共享库组件。