经过三年的工作C++项目,执行已经增长到4兆。我想看看所有这种空间是怎么回事。是有一个工具,可以报告的最大空间的猪是什么?它将很高兴看到大小的类(所有功能在一个类),通过模板(所有实例),并由图书馆(多少属于C的标准图书馆和STL?有多少为每个图书馆在exe?)

编辑:注意,我使用的视觉C++在窗。

有帮助吗?

解决方案

在Linux, 你可以使用 nm 来显示所有的符号在可执行,并对它们进行排序相反的顺序通过的大小:

$ nm -CSr --size-sort <exe>

选项:

  • -C demangles C++的名字。
  • -S 显示了大小的符号。
  • --size-sort 各种各样的符号的大小。
  • -r 反转的排序。

如果你想要得到的结果,每名字空间或每类,你可以 grep 出于'namespace::', 'namespace::class_name::', 等等。.

如果你只想看到的符号的定义 可执行的(不是定义的其他地方,如在图书馆),然后添加 --defined-only.按尺寸应该照顾这一点,虽然,由于不确定的符号是不会有大小。

For Windows, ,你应该仍然可以使用 nm 在你的二进制文件,因为 nm 支持 二进制文件。你可以安装 nm 通过cygwin,或者你可以复制你的窗户可执行的一个linux箱和运行 nm 在它那里。

你也可以试试 dumpbin, ,其中转储信息的一个二元的窗口。你可以得到信息上的符号 /SYMBOLS 开关,但是它看起来并不像它直接提供的信息有关它们的大小。

其他提示

在Windows环境下Visual Studio中编译,这些信息是在您的.MAP文件(这将是近.PDB)。

ADDED :要在.MAP文件中找到的装饰名称转换为更多的东西可读的,你可以使用的 undname.exe 效用随Visual Studio。它在命令行上接受个人姓名或可以给它一个.map文件。

例如,

Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of "?push_back@?$mini_vector@U?$Point@U?$FixedPoint@$0O@H@Math@@@Math@@$05@@QAAXABU?$Point@U?$FixedPoint@$0O@H@Math@@@Math@@@Z" is 

"public: void __cdecl mini_vector<struct Math::Point<struct Math::FixedPoint<14,int> >,6>::push_back(struct Math::Point<struct Math::FixedPoint<14,int> > const &)"

我不能 nm 为我工作,但没有找到一个有用的工具,称为 Sizer.它读出"调试"的信息创建的Visual Studio使用"调试"口访问图书馆。这是很简单的使用,为描述网站上。

  1. Compile with debugging信息的程序的数据库(.pdb)的文件
  2. 运行sizer从命令行,例如 Sizer.exe <path-to-exe-file>.输出去stdout所以你可能会想要重新定向到的文件。

代码尺寸分在不同的部分和按功能、数据、阶级、等等,每个部分按降序排序的代码尺寸。

不要只看码 - 资源很容易造成多兆字节的增长

得到一个链接地图,或者使用 dumpbin 得到一个列表中符号和尺寸。

机会是有很多东西被拉在这你不严格需要的。

添加:你有没有得到令人满意的答案吗?我意识到有两种方法的人的方法问题这样的:

  • 得到测量,之前他们做任何事情。
  • 只要找到一件大事,他们不需要,把它撕了,重复,直到他们不能。

我个人喜欢的后它得到的结果更快。

你说的应用程序是4M.假设真有必要的大小为1MB(或一些这样大小)。这意味着,如果你选择一个例行程序随意从地图文件,75%可能是被什么东西你不需要。找出是什么导致它被包括在内,并看看如果你真的需要它。

在例您了,您看见的一类包装的设备-独立-位图。你可以找到该类的实例在应用,并有可能替换他们的基本WIN32位图。它就会少很漂亮,但是,保存大量的应用程序的大小。

然后继续这样做。每个大块你摆脱的使其余部分采取更大比例的程序,因为该程序已经缩小,但该件没有。这使得他们更容易找到的地图文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top