如何使用C#将变量存储在机器寄存器中?

如何使用C#将变量存储在机器寄存器中?,c#,C#,我在MSDN中引用过,发现了登记器< /Cord>关键字,但它仅在C++中。 语法: register int x = 0; 你能告诉我怎么用C#来做吗?你不能。 IL中没有任何真正有用的寄存器,也不能保证目标机器会有寄存器。JIT或提前编译器将为您做出这些决定。您不能。 IL中没有任何真正有用的寄存器,也不能保证目标机器会有寄存器。JIT或提前编译器将为您做出这些决定。在C#中无法做到这一点。C#被编译成MSIL,然后由JIT编译成本机代码 JIT将决定变量是否进入寄存器。你不应该担心这个

我在MSDN中引用过,发现了登记器< /Cord>关键字,但它仅在C++中。

语法:

register int x = 0;
你能告诉我怎么用C#来做吗?

你不能。 IL中没有任何真正有用的寄存器,也不能保证目标机器会有寄存器。JIT或提前编译器将为您做出这些决定。

您不能。
IL中没有任何真正有用的寄存器,也不能保证目标机器会有寄存器。JIT或提前编译器将为您做出这些决定。

在C#中无法做到这一点。C#被编译成MSIL,然后由JIT编译成本机代码

JIT将决定变量是否进入寄存器。你不应该担心这个


由于MSIL要在不同的体系结构上运行,因此在该语言中包含这样的特性没有多大意义。不同的体系结构具有不同数量的寄存器,这些寄存器的大小可能不同。这就是为什么JIT的工作就是优化它。

在C#中没有办法做到这一点。C#被编译成MSIL,然后由JIT编译成本机代码

JIT将决定变量是否进入寄存器。你不应该担心这个

由于MSIL要在不同的体系结构上运行,因此在该语言中包含这样的特性没有多大意义。不同的体系结构具有不同数量的寄存器,这些寄存器的大小可能不同。这就是为什么JIT的工作就是优化这个

通过使用关键字<代码>否

对于非托管代码,您当然可以。。。我是说,你真的不想。。。但你可以:)

它在极端优化中非常有用,在极端优化中,您肯定可以比
JIT编译器
做得更好。然而,在这些情况下,您可能应该考虑直接的非托管
C
。因此,我强烈敦促你尽可能做到这一点

让我们假设你不能,这绝对是肯定的,必须从
C#

C#
被编译成MSIL,这样就不用再做这些选择了。它实际上也做得很好,所以实际上很少需要手动优化。但是,由于
C 35;
是一种托管语言,您必须进入非托管部分才能做到这一点

有几种方法,有反射和无反射,都使用内联和外部

首先,您可以将
C
ASM
或其他非托管语言中的小fast部分编译为DLL,并从
C#
调用它,调用方式与调用
WinAPI
函数大致相同。。。请注意调用约定,有几个约定,每个约定对
调用方
/
被调用方
。。。例如,参数是如何传递的,以及之后谁清除堆栈

或者,您可以使用
fasmNET
或类似工具来包含任何必须非常快的例程的内联汇编。fast可以(在运行时)将c#中汇编程序的字符串编译成一个内存块,然后可以从c#调用该内存块。。。网上有许多例子

或者,您可以在外部编译所需的指令,自己将它们作为字节数组提供,并以与上面相同的方式将字节数组作为代码调用,但不需要运行时编译步骤

使用内联IL还有许多技巧可以帮助您在没有JIT编译器参与的情况下对代码进行微调,根据您的项目,这些技巧可能对您有用,也可能不有用。自定义IL部分可以通过内联IL和动态IL来完成,并且可以让您更好地控制c#应用程序的运行方式

根据需要在托管和非托管之间来回切换的频率,您还可以从代码中创建单独的应用程序域,并将非托管代码加载到该应用程序域中。。。这可以帮助您分离托管/非托管关注点,从而避免任何代价高昂的来回切换

但是

我不会给出代码,因为如何做在很大程度上取决于您试图完成什么。这不是那种只需将代码片段粘贴到项目中的事情——您需要研究各种方法,了解它们的开销和缺点,然后谨慎、明智和尽职地实施它们

就我个人而言,我建议学习C语言,并将这些计算上重要的任务作为外部服务卸载。这还有一个额外的优点,即允许您使用处理器关联以获得最佳效果。它还允许您为前端编写干净、正常、合理的
C

但是相信我,如果你的代码太慢,你认为使用寄存器来处理一些变量会加快速度。。。好。。。95%的时候,绝对不会<代码>C#在幕后做了大量工作,尽可能有效地协调CPU资源。。。如果您介入并从中夺取几个寄存器的控制权,通常最终会产生总体上不太理想的代码

因此,如果要猜测您的最佳策略,我建议将这个小任务转移到一个单独的C程序或服务中,然后使用C#抛出问题并收集输出。加上亲和力,这可以带来巨大的速度增益。如果需要,也可以在托管代码和非托管代码之间设置共享内存—尽管这需要大量的前瞻性规划,可能需要使用良好的商业调试器的经验,而且初学者肯定不适合

请注意,无论您选择哪种方式,可移植性都会受到不利影响

重新评估你是否真的需要这样做。可能还有许多更明智、更有成效的乐观主义者