我使用C ++作为中间语言,对于每个函数对象,我使用call方法创建一个唯一的类。我要避免的是检查是否已经使用了类似的函数并定义了相应的类,因此我可能最终得到具有不同名称的完全相同的类。所以我想知道编译器(g ++)是否会检测到它并合并类。
答案 0 :(得分:2)
只是澄清以前的答案(这是很好的答案):
编译器绝对不会合并你的类。一些链接器可能在这些方面进行了一些优化,但它绝不是标准功能,标准的Microsoft和GNU / Linux链接器都没有这样做。通常链接器只会在目标文件中直接发出具有相同名称的弱条目时执行此操作,例如,模板实例化会发生这种情况。没有标准的方法直接在C / C ++中获得这种行为,尽管至少GCC提供了扩展来自己控制这种链接。
你应该自己做,因为它实际上是一种优化。杰森是对的,它会“只”减少代码大小,但在现代PC架构上,这本身就是一个巨大的优化。 CPU上的代码缓存并没有变得更大,内存速度也远不及CPU速度,因此拥有过大的代码映像导致的缓存未命中会对性能产生非常严重的影响。有一些基准测试表明,编译Linux内核或大型应用程序(如Firefox或OpenOffice)和-Os(优化大小)在某些工作负载中比使用-O3编译时要快得多。
答案 1 :(得分:1)
不,至少g ++不会,因为类定义了命名空间,所以class A
中的函数实际上与class B
中的函数不同,即使函数本身具有相同的函数名称。例如,A::foo()
与B::foo()
不同。
同样在编译后创建的目标文件中,函数名称被破坏,因此A::foo()
与B::foo()
的文字名称不同,即使编译的目标文件中没有名称空间抽象水平。因此,链接器无法根据其名称从两个不同的C ++类中清除函数。
答案 2 :(得分:0)
我怀疑它会。在一般情况下难以检测到,并且在优化它时没有运行时效率。唯一的节省是代码空间。优化链接器可能会执行此类转换,但这些转换在野外很少见。