Pointers 引用与指针的执行速度

Pointers 引用与指针的执行速度,pointers,compiler-construction,reference,jit,vm-implementation,Pointers,Compiler Construction,Reference,Jit,Vm Implementation,我最近读到一篇关于托管语言是否比本地语言(特别是C#vs C++)慢(或快)的讨论。一位参与讨论的人士表示,托管语言的JIT编译器将能够对引用进行优化,而这在使用指针的语言中是不可能的 我想知道的是什么样的优化可以在引用上而不是指针上实现 请注意,讨论的是执行速度,而不是内存使用情况。Wikipedia中提到的有一些好处: JIT代码通常比解释器提供更好的性能。此外,在某些或许多情况下,它可以提供比静态编译更好的性能,因为许多优化只在运行时可行: 编译可以针对目标CPU和应用程序运行的操作系统模

我最近读到一篇关于托管语言是否比本地语言(特别是C#vs C++)慢(或快)的讨论。一位参与讨论的人士表示,托管语言的JIT编译器将能够对引用进行优化,而这在使用指针的语言中是不可能的

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


请注意,讨论的是执行速度,而不是内存使用情况。

Wikipedia中提到的有一些好处:

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

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

  • <>我不能直接考虑引用的使用,而不是指针的使用。

    < P> C++中,与优化方面有关的引用有两个优点:

  • 引用是常量(在其整个生命周期内引用同一变量)

    因此,编译器更容易推断哪些名称引用相同的基础变量,从而创造优化机会。不能保证编译器在引用方面会做得更好,但它可能

  • 引用被假定为引用某物(不存在空引用)

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


  • 但是,这些优势都没有直接延续到托管语言,因此我不认为这与您的讨论主题有什么关联。

    一般来说,引用可以从不同的位置引用同一对象

    “指针”是实现引用的机制的名称。C++,Pascal,C.…有指针,C++提供另一种机制(稍微有些其他用例)称为“引用”,但本质上这些都是一般引用概念的实现。 因此,根据定义,引用没有理由比指针快/慢


    真正的区别在于使用JIT或经典的“前端”编译器:JIT可以考虑前端编译器不可用的数据。它与“参考”概念的实施无关。

    其他答案是正确的


    < >我只想补充,除非程序在计数器中花费大量的时间,否则在C++中,任何优化都不会产生很大的差异,比如在不包含函数调用的紧循环中(例如比较字符串)。为了理解它们的特殊性,想象一下在没有垃圾收集对象引用的情况下,在机器级别如何处理以下场景:方法“Foo”返回一个字符串,该字符串存储在不同的集合中,并传递给不同的代码段。一旦不再需要该字符串,应该可以回收存储该字符串时使用的所有内存,但不清楚最后使用该字符串的是哪段代码

    在非GC系统中,每个集合要么需要有自己的字符串副本,要么需要保存包含指向共享对象的指针的内容,该共享对象保存字符串中的字符。在后一种情况下,共享对象需要知道指向它的最后一个指针何时被删除。有多种方法可以处理这一问题,但其中一个基本的共同点是,当指向共享对象的指针被复制或销毁时,需要通知共享对象。这种通知需要进行一些工作

    相比之下,在GC系统中,程序用元数据进行修饰,以说明在任何给定时间将使用哪些寄存器或堆栈帧的一部分来保存根对象引用。当垃圾回收周期发生时,垃圾回收器将不得不解析这些数据,识别并保存所有活动对象,并对其他所有内容进行核处理。然而,在其他任何时候,处理器都可以复制、替换、洗牌或销毁它喜欢的任何模式或序列中的引用,而不必通知任何相关对象。请注意,在多处理器系统中使用指针使用通知时,如果不同的线程可能复制或销毁对同一对象的引用,则需要同步代码来确保必要的通知线程安全。相比之下,在GC系统中,每个处理器可以随时更改引用变量,而不必与任何其他处理器同步其操作。

    如果您不是mana