我可以在我的代码库中有选择地禁用 RTTI 以减小二进制文件的大小吗?

Can I disable RTTI selectively in my code base to reduce the binary size?

我正在开发一个 iPhone 应用程序,该应用程序使用 C++ 并且几乎达到 100 MB 标记(Apple 不允许人们通过 WWAN 下载它)。我采取了许多措施来减少二进制文件的大小,例如删除不需要的第三方依赖项。但是,该应用程序(尤其是二进制文件)仍然很大,因为它具有很多功能。

我听说禁用 RTTI 可以减小二进制文件的大小。是否可以为某些文件关闭 RTTI,例如所有没有字符串 "typeid" 或 "dynamic_cast" 的文件?

RTTI 的 space 成本与 使用 无关(通过 typeiddynamic_cast),但类型信息与每个 class 相关联。因此,好处是为单个 classes(或 classes 组)禁用 RTTI。

我不知道这样做的方法。

可能 发现,如果可以减少带有虚函数的 classes 的数量,就可以减少 RTTI 信息量。 (例如,并非所有基 classes 都需要有一个虚拟析构函数——你只需要它,如果你可以调用 delete pBase。)

另一个可能会增大可执行文件大小的因素是大量的模板。在许多情况下,您可以制作模板函数,这些模板函数只是转发给非模板函数来完成真正的工作。