2011-04-22 104 views
1

我正在使用C++作为中间语言,为每个函数对象创建一个具有调用方法的独特类。我正在避免的是检查是否已经使用了一个类似的函数,并且定义了相应的类,所以我最终可能会得到完全相同的类,并且名称不同。所以我想知道如果编译器(g ++)会检测到这个并合并类。编译器优化重复类

回答

2

只是为了澄清两个以前的答案(这是很好的答案):

编译器绝对不会合并你的类,在所有。一些连接器可能沿着这些线有一些优化,但它绝不是标准功能,标准的Microsoft和GNU/Linux连接器都没有这样做。通常情况下,链接器只会这样做,如果您直接在目标文件中发出具有相同名称的弱条目,这就是模板实例化所发生的情况。虽然至少GCC提供了扩展来自己控制这种链接,但没有直接在C/C++中获得这种行为的标准方法。

你应该自己做,因为它实际上是一种优化。贾森是正确的,它会“减少”代码大小,但在现代PC架构上本身就是一个巨大的优化。 CPU上的代码缓存没有变得更大,内存速度也无法接近CPU速度,因此,由于代码图像过大导致缓存未命中可能会对性能造成严重影响。有一些基准测试显示,编译Linux内核或诸如Firefox或OpenOffice等大型应用程序时,使用-Os(优化大小)在某些工作负载中的编译速度要比使用-O3编译时大幅度提高。

0

我怀疑它会。这在一般情况下很难检测到,并且在优化时没有运行效率。唯一的节省是代码空间。优化链接器可能会执行这样的转换,但这些转换器在野外很少见。

1

不,至少g ++不会,因为一个类定义了一个名称空间,因此即使函数本身具有相同的名称,class A中的函数实际上也不会与class B中的函数相同。例如,A::foo()B::foo()不一样。

而且编译后生成的目标文件中的函数名是错位的,所以A::foo()不会有相同的文字名称B::foo()即使是在编译的目标文件级别没有命名空间的抽象。所以链接器不能根据它们的名字去除两个不同C++类中的函数。