三年后在C ++项目时,可执行文件已发展到4 MB。 我想看到所有这个空间是怎么回事。 是否有一个工具,可以报告的最大空间猪是什么? 这将是很好地看到班级规模(类中的所有功能),通过模板(所有实例),以及图书馆(多少属于C标准库和STL?有多少在EXE每个库?)
编辑:请注意,我用Visual C ++在Windows上。
三年后在C ++项目时,可执行文件已发展到4 MB。 我想看到所有这个空间是怎么回事。 是否有一个工具,可以报告的最大空间猪是什么? 这将是很好地看到班级规模(类中的所有功能),通过模板(所有实例),以及图书馆(多少属于C标准库和STL?有多少在EXE每个库?)
编辑:请注意,我用Visual C ++在Windows上。
在Linux中 ,你可以用nm
来显示所有的符号在可执行文件和大小将它们以相反的顺序进行排序:
$ nm -CSr --size-sort <exe>
选项:
-C
demangles C ++名称。 -S
示出了符号的大小。 --size-sort
按大小排序的符号。 -r
颠倒排序。 如果你想获得每个命名空间或每班的结果,你可以grep
输出为“ namespace::
”,“ namespace::class_name::
” 等 。
如果你只想看到在可执行文件中定义的符号(不是那些在图书馆其他地方定义,等),再加入--defined-only
。 按大小排序,应该照顾到这一点,不过,因为不确定的符号是不会有大小。
对于Windows,你也应该能够使用nm
上的二进制文件,因为nm
支持COFF二进制文件。 您可以安装nm
通过Cygwin,或者你可以在你的Windows可执行文件复制到一台Linux机器并运行nm
就可以了那里。
您也可以尝试dumpbin
,其中转储有关Windows二进制信息。 你可以在与符号信息/SYMBOLS
开关,但它并不像它直接提供了有关其大小的信息。
在Windows环境下Visual Studio中编译,这些信息是在您的.MAP文件(这将是近.PDB)。
增加 :要在.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
为我工作,但还是设法找到一个名为有用的工具仪 。 它读取通过调试接口访问库的Visual Studio中创建的调试信息。 这是非常简单的使用,在网站上的描述。
Sizer.exe <path-to-exe-file>
。 输出会去到stdout,所以你可能会想重定向到一个文件。 代码大小以不同的部分分解,并通过功能,数据,类等,以递减的代码大小的顺序排列各部分分组。
不要只看码 - 资源很容易造成多兆字节的增长。
得到一个链接的地图,或使用dumpbin
获得的符号和大小的列表。
机会是有很多东西拉进你不严格需要。
增加:你有没有得到满意的答复? 我意识到有两种方式接近的人这样的问题:
我个人更喜欢后者 - 它得到的结果更快。
你说该应用程序为4MB。 假设真有必要大小为1MB(或一些这样的大小)。 这意味着如果你在映射文件随机选择一个程序中,75%的可能是一些你不需要的东西。 找出导致它被列入,看看你是否真的需要它。
在你给的例子,你看到包装设备无关的位图的一类。 你可以找到该类的实例在您的应用程序,并可能与基本的WIN32位图替换它们。 这将是相当少的,但保存应用程序大小的采空区。
然后继续这样做。 每件大件你摆脱使得残片把应用程序的比例较大,因为该应用程序已今非昔比,但作品没有。 这使得他们更容易在地图文件中找到。