低内存系统上的c ++。标准库正在使用所有内存!

我需要尽可能多地削减内存。我正在使用带有STL的标准C ++。该程序没有做太多(还),它仍然需要960Kb [根据
top
]!可执行文件大小仅为64KB。 代码是3000行长,我显然不会发布。我认为问题不在于我的代码,而在于系统库。 单个main()函数(包括我的所有代码但不使用它)使用732Kb的RAM! 简单代码:
int main() {
sleep(1000); //do nothing
return 0;
}
//Uses 732kb of RAM
我的代码没有全局变量(除了隐藏在我的库中的变量)。 我正在使用标准库:libstdc ++(STL),GNU libc。还有一个BSD套接字和libev以及非标准的STL绳索类。 我可以运行一些内存分析器吗? 平台:Linux 2.6.18-32,32位处理器,16MB总系统RAM,无可用交换 编译:GCC 4 标准库:GCC的libstdc ++ 编译器选项:-Os(无调试符号) 我没有大量使用模板:容器和迭代器都是。但是我正在大量使用SGI STL绳索类。 测试环境是运行Linux的基本服务器,具有128MB RAM,Pentium III 667 Mhz,CentOS 5.5,无需仿真。 更新:我想知道库本身(代码大小)是否导致问题。不需要将共享库加载到RAM中吗?     
已邀请:
开始剥离功能,直到内存使用率下降。首先是极端 - 如果你可以用
sleep(1000);
替换
main
并且你的内存使用率仍然很高,那么查看代码和静态数据 - 在全局范围内初始化的任何内容或类或函数内的静态内容,以及不同类型的模板实例化和调试符号。 更新:删除了有关STL分配器的错误注释。它可能适用于其他编译器/ STL版本(如果要查看它,请检查历史记录),但它不适用于此问题。 请注意,
malloc
/
operator new
通常会吝啬将可用内存返回给操作系统,这将导致整个程序不会随着时间的推移缩小其显而易见的使用率;通过将来的分配,内存将在整个程序中重用,所以除了将“内存使用”数字无限期地保持在高水位或接近高水位线之外,这通常不是一个大问题。     
  更新:我想知道是否   库本身(代码大小)是   造成这个问题。不共享   库需要加载   内存? 答对了。至少在Mac OS X上,Top包括物理内存使用中共享库的大小。当然,每个库中只有一个副本驻留在内存中。 查看
top
的文档以获取解决方法,或者只是将其卡住并使用
malloc_info()
。但是要小心找到一种方法来考虑代码,堆栈和全局使用情况。     
获取链接器以发出链接映射文件;您可以使用它来确定代码所需的静态链接代码和静态数据空间的确切数量。 堆栈,堆空间和共享库是附加的,并在运行时分配。 如果你有16Mb的内存,那真的很重要吗?可能存在相对较大但固定的开销,并且您的总体内存占用量不会随着添加的代码行线性增长。     
由于目标是一个linux,我认为你可以通过查看地图和smaps文件/ proc / {pid_number}来了解内存使用的细节,特别是共享库组件。     

要回复问题请先登录注册