gpt4 book ai didi

.net - 当用于自赋值时,编译器是否优化了 Null Coalescing 运算符?

转载 作者:行者123 更新时间:2023-12-04 04:07:44 26 4
gpt4 key购买 nike

这两个代码块在功能上是相同的

if (myObj == null)
{
myObj = new MyObj();
}


myObj = myObj ?? new MyObj();

但是,在 myObj 不为 null 的情况下,使用 null 合并运算符的操作符会进行不必要的赋值。但后来我想也许编译器优化了这些自分配。有谁知道编译器是否会注意到正在发生的事情并将底部片段转换为顶部片段?

最佳答案

出于比较目的,我尝试编译两者

object myObj = null;
myObj = myObj ?? new object();


object myObj = null;
if(myObject == null)
{
myObj = new object();
}
Main 内部方法。 (我在 Mono 2.6.7 上使用 MonoDevelop 2.4)

如果代码按预期进行了优化,我们应该会看到生成了类似的 IL。这是 Main 的第一个版本的 IL :
.method public static  hidebysig 
default void Main (string[] args) cil managed
{
.entrypoint
.maxstack 3
.locals init (
object V_0)
IL_0000: ldnull
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: dup
IL_0004: brtrue IL_000f

IL_0009: pop
IL_000a: newobj instance void object::'.ctor'()
IL_000f: stloc.0
IL_0010: ret
}

对于第二个版本:
.method public static  hidebysig 
default void Main (string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init (
object V_0)
IL_0000: ldnull
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: brtrue IL_000e

IL_0008: newobj instance void object::'.ctor'()
IL_000d: stloc.0
IL_000e: ret
}

所以第一个版本(使用 null-coalescing 运算符)生成了更多的 IL。

但是有两点需要注意:
  • 这个 IL 是我使用 MoveDevelop 得到的——如果你在 Visual Studio 中编译它,它很可能是一个不同的故事。也许它在微软的 with 编译器中进行了优化。即使它们相同,其他人的编译器也可以轻松优化它。仅仅因为某些编译器适用,并不意味着您会期望每个编译器都有它。
  • CLR 使用 JIT。即使这没有在编译时进行优化,它也可能在运行时进行了优化。事实上,这很可能是编译不那么关心这种微优化的原因。
  • 关于.net - 当用于自赋值时,编译器是否优化了 Null Coalescing 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6448089/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com