我正在使用C++作为中间语言,为每个函数对象创建一个具有调用方法的独特类。我正在避免的是检查是否已经使用了一个类似的函数,并且定义了相应的类,所以我最终可能会得到完全相同的类,并且名称不同。所以我想知道如果编译器(g ++)会检测到这个并合并类。编译器优化重复类
Q
编译器优化重复类
1
A
回答
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++类中的函数。
相关问题
- 1. 编译器优化
- 2. 编译器优化
- 3. 编译器会自动优化重复代码吗?
- 4. JVM JIT编译器如何优化“重复”Java代码?
- 5. 重复访问者调用的编译器优化
- 6. Java编译器优化
- 7. 克++编译器的优化
- 8. 编译器优化问题
- 9. 编译器谓语优化
- 10. Requirejs优化器不编译
- 11. 二郎编译器优化
- 12. 编译器优化实现
- 13. C++编译器优化
- 14. Webpack - 优化编译时间(热重载)
- 15. 是由编译器优化的类上的硬编码数组?
- 16. CLR语言优化。语言编译器VS JIT编译器
- 17. 调试期间的编译器优化
- 18. 由编译器优化的变量
- 19. 虚拟函数编译器优化C++
- 20. 的std ::移动与编译器优化
- 21. 隐式else编译器优化
- 22. 编译器优化与参数
- 23. 编译器优化与增量
- 24. 编译器会优化这个
- 25. 不C#编译器优化空语句
- 26. 函数参数的编译器优化
- 27. C编译器结构优化
- 28. noexcept说明符和编译器优化
- 29. Delphi编译器是否执行优化?
- 30. 编译器优化使程序崩溃