低内存系统上的c++.标准库使用了所有的内存
c++ on low memory systems. Standard libs are using all the memory!
我需要尽可能地减少内存。我使用标准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}
- 了解内存序列和标准::memory_order_relaxed
- 目标c是否需要一个标准来定义像c++11这样的内存模型
- 在C++标准中记录对象的内存布局的哪个位置?
- 如何使用 RPM 从内存中读取标准::字符串
- 标准::矢量增加峰值内存
- 标准::shared_ptr(s) 和内存泄漏
- 标准::字符串中的内存泄漏
- 了解标准::原子内存屏障
- C++标准库中是否有保证不执行动态内存分配的函数或类
- 如果malloc/free对显然做了同样的工作,为什么C++标准库容器使用内存池
- 为什么C 标准专门为具有不同访问说明符的类数据成员的内存布局提供了余地
- 内存效率标准::地图替代
- C++对间接运算符的标准描述是否保证内存写入不会被优化掉
- win32 标准::线程泄漏内存
- 复制有状态分配器:标准库分配器语义和内部内存
- 可视标准::队列内存消耗导致内存泄漏 - C++
- 将内存复制到标准::复制
- 如何以标准方式从未对齐的内存中获取值
- 带有标准容器和常量引用的c++代码显示出意外的内存
- 标准::字符串使用的可用内存