引用与指针的执行速度

Dav*_*all 10 compiler-construction jit pointers reference vm-implementation

我最近阅读了关于托管语言是否比本机语言(特别是C#vs C++)更慢(或更快)的讨论.一位参与讨论的人说,托管语言的JIT编译器能够对使用指针的语言中无法实现的引用进行优化.

我想知道的是什么样的优化可以在引用而不是指针上?

请注意,讨论是关于执行速度,而不是内存使用情况.

hjh*_*ill 10

在C++中,与优化方面相关的引用有两个优点:

  1. 引用是常量(指整个生命周期内的相同变量)

    因此,编译器更容易推断哪些名称引用相同的底层变量 - 从而创建优化机会.无法保证编译器在引用方面做得更好,但它可能......

  2. 假设引用引用某些内容(没有空引用)

    可以创建"不引用任何内容"(相当于NULL指针)的引用,但这并不像创建NULL指针那么容易.因此,可以省略对NULL的引用的检查.

但是,这些优点都不会直接传递给托管语言,因此我不会在讨论主题的上下文中看到它的相关性.


hag*_*i_e 3

维基百科中提到了JIT 编译的一些好处:

JIT 代码通常提供比解释器更好的性能。此外,在某些或许多情况下,它可以提供比静态编译更好的性能,因为许多优化仅在运行时可行:

  1. 编译可以针对目标 CPU 和应用程序运行的操作系统模型进行优化。例如,当 JIT 检测到 CPU 支持 SSE2 CPU 指令时,它可以选择 SSE2 CPU 指令。使用静态编译器,必须编写两个版本的代码,可能使用内联汇编。
  2. 该系统能够收集有关程序在其所处环境中实际运行情况的统计信息,并且可以重新排列和重新编译以获得最佳性能。然而,一些静态编译器也可以将配置文件信息作为输入。
  3. 系统可以进行全局代码优化(例如库函数的内联),而不会失去动态链接的优点,也不会产生静态编译器和链接器固有的开销。具体来说,在进行全局内联替换时,静态编译器必须插入运行时检查,并确保如果对象的实际类覆盖内联方法,就会发生虚拟调用。
  4. 尽管静态编译的垃圾收集语言可以实现这一点,但字节码系统可以更轻松地重新排列内存以更好地利用缓存。

我想不出与使用引用而不是指针直接相关的东西。