我注意到反射是其他语言的开发人员发现 C++ 中非常缺乏的一项功能。对于某些应用程序,我真的明白为什么!如果您有反射,编写诸如 IDE 的自动完成之类的东西要容易得多。当然,如果我们拥有序列化 API,世界将会变得更容易。
另一方面,C++ 的主要原则之一是不为不使用的东西付费。这是完全有道理的。这就是我喜欢 C++ 的地方。
但在我看来,可能会有妥协。为什么编译器不向std::type_info
结构添加扩展?不会有运行时开销。二进制文件最终可能会更大,但这可能是一个简单的编译器开关来启用/禁用,老实说,如果你真的关心空间节省,你可能会禁用异常和 RTTI。
有些人引用了模板的问题,但编译器已经很高兴地std::type_info
为模板类型生成了结构。
我可以想象一个像-fenable-typeinfo-reflection
这样的 g++ 开关可能会变得非常流行(并且像 boost/Qt/etc 这样的主流库可以很容易地检查生成使用它的代码(如果有的话),在这种情况下,最终用户将受益于没有比翻转更多的成本一个开关)。我不觉得这是不合理的,因为像这样的大型可移植库已经依赖于编译器扩展。
那么为什么这不是更常见的呢?我想我错过了一些东西,这有什么技术问题?
编辑:只有几个指标重新膨胀论点:
我查看了一个相当大的 Qt 项目(大约 45,000 LoC)并测量了元对象的大小。我觉得这是一个合理的度量标准,因为 Qt moc 系统是一个相当详尽的反射系统(类型、函数、枚举、成员和一些 Qt 特定的概念,如“属性”)。总共有67 个元对象,所以不是一个微不足道的数量,但也没有什么疯狂的,加起来是 5479 字节。然而,几乎所有这些都是 32 字节或更少(最大的是 1427 字节)。考虑到即使是最简单的程序,现代编译器也会生成超过 4K 的二进制文件,这些数字并不离谱)。虽然我很想看到这样的东西适用于STL
看看它是如何公平的。