今天我的一位同事来问我标题中提到的问题.
他目前正在尝试减少代码库的二进制文件占用空间,这也用于小型目标(如Cortex M3等).显然他们决定在RTTI打开的情况下进行编译(实际上是GCC),以支持正确的异常处理.
好吧,他的主要抱怨是为什么std::type_info::name()实际上需要RTTI的支持,并问,如果我知道一种方法来抑制生成支持这一点所需的字符串文字,或者至少缩短它们.
的std :: TYPE_INFO ::名
const char* name() const;返回包含类型名称的实现定义的以null结尾的字符串.不给出任何保证,特别是返回的字符串对于几种类型可以是相同的,并且在相同程序的调用之间改变.
A, - 但是特定于编译器 - ,例如dynamic_cast<>运算符的实现不会使用此信息,而是类似于用于类型确定的哈希标记(类似于catch()具有异常处理的块).
我认为后者明确表达了当前的标准定义
我不得不同意,std::type_info::name()除了用于调试(日志记录)之外,我还没有真正看到使用点.我不是100%确定异常处理只能在没有RTTI的情况下使用当前版本的GCC(我认为它们使用的是4.9.1),所以我犹豫是否建议只需关闭RTTI.
也是dynamic_casts<>在他们的代码库中使用的情况,但对于这些,我只是建议不要使用它,支持static_cast(他们没有像插件那样的东西,或者除了断言之外还需要运行时类型检测).
std::type_info::name()除了日志记录?有没有人有一个想法,如何克服(解决)这些无用的字符串文字的生成(假设它们永远不会被使用)?
RTTI是否真的(仍然)需要支持GCC的异常处理?
(这个部分现在很好地解决了@ Sehe的答案,并且我已经接受了它.另外一个子问题仍然留给std::type_info代码中使用的任何异常的剩余生成实例.我们很确定,这些文字永远不会随处使用)
相关的一点:删除膨胀可执行(GCC)的未使用的运行时函数