Pointers 引用与指针的执行速度
我最近读到一篇关于托管语言是否比本地语言(特别是C#vs C++)慢(或快)的讨论。一位参与讨论的人士表示,托管语言的JIT编译器将能够对引用进行优化,而这在使用指针的语言中是不可能的 我想知道的是什么样的优化可以在引用上而不是指针上实现Pointers 引用与指针的执行速度,pointers,compiler-construction,reference,jit,vm-implementation,Pointers,Compiler Construction,Reference,Jit,Vm Implementation,我最近读到一篇关于托管语言是否比本地语言(特别是C#vs C++)慢(或快)的讨论。一位参与讨论的人士表示,托管语言的JIT编译器将能够对引用进行优化,而这在使用指针的语言中是不可能的 我想知道的是什么样的优化可以在引用上而不是指针上实现 请注意,讨论的是执行速度,而不是内存使用情况。Wikipedia中提到的有一些好处: JIT代码通常比解释器提供更好的性能。此外,在某些或许多情况下,它可以提供比静态编译更好的性能,因为许多优化只在运行时可行: 编译可以针对目标CPU和应用程序运行的操作系统模
请注意,讨论的是执行速度,而不是内存使用情况。Wikipedia中提到的有一些好处: JIT代码通常比解释器提供更好的性能。此外,在某些或许多情况下,它可以提供比静态编译更好的性能,因为许多优化只在运行时可行:
<>我不能直接考虑引用的使用,而不是指针的使用。 < P> C++中,与优化方面有关的引用有两个优点:
但是,这些优势都没有直接延续到托管语言,因此我不认为这与您的讨论主题有什么关联。一般来说,引用可以从不同的位置引用同一对象 “指针”是实现引用的机制的名称。C++,Pascal,C.…有指针,C++提供另一种机制(稍微有些其他用例)称为“引用”,但本质上这些都是一般引用概念的实现。 因此,根据定义,引用没有理由比指针快/慢
真正的区别在于使用JIT或经典的“前端”编译器:JIT可以考虑前端编译器不可用的数据。它与“参考”概念的实施无关。其他答案是正确的
< >我只想补充,除非程序在计数器中花费大量的时间,否则在C++中,任何优化都不会产生很大的差异,比如在不包含函数调用的紧循环中(例如比较字符串)。为了理解它们的特殊性,想象一下在没有垃圾收集对象引用的情况下,在机器级别如何处理以下场景:方法“Foo”返回一个字符串,该字符串存储在不同的集合中,并传递给不同的代码段。一旦不再需要该字符串,应该可以回收存储该字符串时使用的所有内存,但不清楚最后使用该字符串的是哪段代码 在非GC系统中,每个集合要么需要有自己的字符串副本,要么需要保存包含指向共享对象的指针的内容,该共享对象保存字符串中的字符。在后一种情况下,共享对象需要知道指向它的最后一个指针何时被删除。有多种方法可以处理这一问题,但其中一个基本的共同点是,当指向共享对象的指针被复制或销毁时,需要通知共享对象。这种通知需要进行一些工作 相比之下,在GC系统中,程序用元数据进行修饰,以说明在任何给定时间将使用哪些寄存器或堆栈帧的一部分来保存根对象引用。当垃圾回收周期发生时,垃圾回收器将不得不解析这些数据,识别并保存所有活动对象,并对其他所有内容进行核处理。然而,在其他任何时候,处理器都可以复制、替换、洗牌或销毁它喜欢的任何模式或序列中的引用,而不必通知任何相关对象。请注意,在多处理器系统中使用指针使用通知时,如果不同的线程可能复制或销毁对同一对象的引用,则需要同步代码来确保必要的通知线程安全。相比之下,在GC系统中,每个处理器可以随时更改引用变量,而不必与任何其他处理器同步其操作。如果您不是mana