那里有"功能大小分析器"吗?

Qwe*_*tie 14 c++ size profiler function

在从事C++项目三年后,可执行文件已增长到4 MB.我想看看所有这些空间的去向.有没有一种工具可以报告最大的太空猪是什么?很高兴看到按类(类中的所有函数),模板(所有实例化)和库(多少属于C标准库和STL?exe中的每个库有多少?)的大小.

编辑:注意,我在Windows上使用Visual C++.

Tod*_*lin 15

在Linux中,您可以使用nm显示可执行文件中的所有符号,并按大小按相反顺序对它们进行排序:

$ nm -CSr --size-sort <exe>
Run Code Online (Sandbox Code Playgroud)

选项:

  • -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开关获取有关符号的信息,但看起来并不直接提供有关其大小的信息.

  • 感谢您解释所使用参数的含义,而不仅仅是将整个命令作为魔术咒语.更多人应该效仿你的榜样. (3认同)

Cra*_*rks 7

在Visual Studio编译的Windows中,此信息位于.map文件中(它将位于.pdb附近).

增加:要将.map文件中找到的修饰名称转换为更易于阅读的名称,可以使用Visual Studio附带的undname.exe实用程序.它接受命令行上的单个名称,或者您可以为它提供.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 &)"
Run Code Online (Sandbox Code Playgroud)

  • 我正在查看我的地图文件,并没有真正看到像"0001:0000f380?push_back @?$ mini_vector @ U?$ Point @ U?$ FixedPoint @ $ 0O @ H @ Math @@@ Math @@ $ 05 @@ QAAXABU?$ Point @ U?$ FixedPoint @ $ 0O @H @ Math @@@ Math @@@ Z 10010380 fi dibitmapsce:DIBitmap.obj"对于分析非常有用. (2认同)