C++中的类/函数模板占用了我的二进制文件的百分比是多少?

What percentage of my binary is taken up by a class/function template in C++?

本文关键字:二进制文件 我的 百分比 多少 函数模板 C++      更新时间:2023-10-16

我是一名游戏开发人员,我经常发现自己在为我的需求编写专门的模板化容器。

在看了我(现在)最喜欢的一个 cppcon演讲后,我有兴趣找到给定类/函数模板占用的最终二进制文件的百分比,以确定一些提升是否有益。

在这里,Nicolas提到育碧的程序员使用他们内部的.obj分析器来确定他们的Array类占用了他们总二进制大小的~80%,然后他们通过提升将其降低到~15%(在调试目标中)。

我想知道如何编写这样的工具。具体来说,我正在寻找一种可以告诉我的工具:

  1. 给定一个类的未修改名称的类的所有成员和非成员函数所占的总二进制大小的百分比,以及
  2. 单个函数(成员或非成员)给定其未修改的名称所占的总二进制大小的百分比。

我想知道如何在Windows和Linux环境中为使用gcc,clang和Microsoft编译器编译的代码执行此操作。

例如,我想要类似以下内容的内容:

./<toolname> <compiler sepecific options and/or whatever> <class/function name> 
<list of object files>

如果要求函数的大小:

Summary for function <name>:
Total Size: <size in bytes> (<percentage>)

如果要求班级的大小:

Summary for class <name>:
Total Size: <size in bytes> (<percentage>)
member function <name>: <size> (<percentage>)
...
non-member function <name>: <size> (<percentage>)
...

我相信我可以用一个稍微不平凡的程序自己做到这一点,但我认为最好先在这里询问,以防万一有内置或免费提供的 CLI 工具的某种组合可用于获取此类信息。

如果你的解决方案包含一系列记录良好的工具,我不需要解释。但是,如果您编写自定义工具,我想对您的方法有一个广泛的概述。

您可以使用调试信息编译程序,因此具有每个符号位置的符号表将出现在可执行标头中。例如,使用 readelf 或 objdump 来获取此信息。