c++ - 为什么 Linux 报告我的应用程序的内存使用量太大?

标签 c++ linux g++ clang++

我花了很多精力来确保我编写的 C++ 应用程序消耗的内存很少。然后我运行了 top(和其他类似的 Linux 命令)并且很失望地看到我的应用程序占用的时间比我想象的要多。我花了一些时间来挖掘那段内存的去向,但这有点毫无结果。我终于写出了我能想到的最简单的应用程序:

int main() {
    for(;;)
        ;
}

并在这方面名列前茅。 Top 报告说我的极简主义应用程序消耗了 728K RES 和 4,224K VIRT!当我使用 clang++ 而不是 g++ 时,它增加到 1,612K RES 和 13,264 VIRT!有没有搞错?我记得应用程序不能超过 640K 的旧 DOS 时代。现在一个简单的空 for 循环比这还要多?显然我错过了一些东西。这是什么?

顺便说一句,我正在运行 Mint 8.1。

最佳答案

首先,您的最小程序会调用未定义行为。是的,infinite loop in C++ invokes Undefined Behavior .

更重要的是,main() 通常是 not the first function executed在你的程序中。设置了很多结构,全局对象可能会也可能不会在 main 之前初始化。

默认情况下,您的工具链(至少是流行的工具链)将链接其他库,包括(但不限于):

  • 您的工具链的 C++ 运行时库(通过一些基本服务支持您的 C++ 程序)
  • C++ 标准库,很可能也是 C 标准库
  • 您的操作系统库(您的程序还如何与控制台通信?)
  • 可能还有更多。

您的可执行文件本身将包含一些额外的结构,以使操作系统能够将您的程序加载到内存中,解析要加载的外部库等等。

关于c++ - 为什么 Linux 报告我的应用程序的内存使用量太大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44252707/

相关文章:

c++ - <winsock.h> 和 <winsock2.h> 之间有区别吗?

linux - 是否有可能在 linux 中从系统库中抑制用户库

gcc - 将 .o 文件路径添加到 ld 默认值(crtbeginS.o,而不是 .so 文件)

c++ - 为什么可以只给一个接受引用的函数一个对象(而不是一个引用)?是否自动生成引用?

c++ - WMV 媒体流在 Windows 7 上比在 XP 上看起来更像素化

c++ - 如何将 glfw 库包含到 C++ 项目中?

linux - 我如何了解在 Unix/Linux 上退出 Go 的未知子项?

linux - 如何 : Using syslog for user created shell script

c++ - 我可以使用 Putty 和 sublime 进行远程编译吗?

c++ - g++ 中的 fstream 链接错误与 -std=gnu++0x