编译器会优化集合初始化吗?

阿斯特夫

编译器会优化此代码,还是在每次方法调用后初始化集合?

private string Parse(string s)
{
    var dict = new Dictionary<string, string>
    {
        {"a", "x"},
        {"b", "y"}
    };

    return dict[s];
}

如果答案是否定的,我建议使用以下解决方案:在C#中创建常量字典

尤瓦尔·伊茨恰科夫(Yuval Itzchakov)

当出现这样的问题,而您不确定答案是什么时,“在幕后”看起来总是很好。

这是在打开优化器的情况下编译器生成的IL:

Parse:
IL_0000:  newobj      System.Collections.Generic.Dictionary<System.String,System.String>..ctor
IL_0005:  stloc.1     // <>g__initLocal0
IL_0006:  ldloc.1     // <>g__initLocal0
IL_0007:  ldstr       "a"
IL_000C:  ldstr       "x"
IL_0011:  callvirt    System.Collections.Generic.Dictionary<System.String,System.String>.Add
IL_0016:  ldloc.1     // <>g__initLocal0
IL_0017:  ldstr       "b"
IL_001C:  ldstr       "y"
IL_0021:  callvirt    System.Collections.Generic.Dictionary<System.String,System.String>.Add
IL_0026:  ldloc.1     // <>g__initLocal0
IL_0027:  stloc.0     // dict
IL_0028:  ldloc.0     // dict
IL_0029:  ldarg.1     
IL_002A:  callvirt    System.Collections.Generic.Dictionary<System.String,System.String>.get_Item
IL_002F:  ret    

如您所见,它调用newobj分配Dictionary<K,V> 时间,同时加载本地变量和Dictionary.Add每次调用它们(这是call的语法上的糖当量Add)。对于缓存对象创建,它不了解类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在某些优化级别上,编译器会警告未初始化的边缘迭代器?

来自分类Dev

使用列表初始化时,C ++语言是否会强制执行编译器优化?

来自分类Dev

为什么编译器不优化此初始化?

来自分类Dev

现代C ++编译器会自动将局部变量初始化为0吗?

来自分类Dev

为什么编译器会警告不要在初始化列表中隐藏成员?

来自分类Dev

C ++(g ++编译器)动态初始化静态声明的数组会导致内存问题

来自分类Dev

编译器可以正确处理静态变量的初始化顺序吗?

来自分类Dev

C#编译器会优化此代码吗?

来自分类Dev

编译器会优化未使用的链接文件吗?

来自分类Dev

编译器会优化除法乘法吗

来自分类Dev

Java编译器会优化基于静态变量进行条件化的静态函数吗?

来自分类Dev

无法初始化编译器:在编译器镜像中找不到对象java.lang.Object

来自分类Dev

编译器会优化条件中的双重逻辑否定吗?

来自分类Dev

编译器会优化返回固定大小数组的结构的函数吗?

来自分类Dev

编译器会优化返回固定大小数组的结构的函数吗?

来自分类Dev

让编译器初始化数组或手动遍历数组以进行初始化是否更快?

来自分类Dev

初始化多维数组时,编译器如何解释不完整的初始化列表?

来自分类Dev

编译器无法识别std :: vector的成员初始化器

来自分类Dev

Java编译器允许使用'this'关键字访问未初始化的空白final字段吗?这是一个错误吗?

来自分类Dev

Java编译器会汇编吗?

来自分类Dev

为什么编译器将此变量初始化为错误的值?这是对齐问题吗?

来自分类Dev

编译器未检测到明显未初始化的变量

来自分类Dev

Kotlin:“同步”使编译器不确定变量的初始化

来自分类Dev

说服编译器数组的每个索引都将被初始化

来自分类Dev

缩小转换和初始化列表的范围,哪个编译器正确?

来自分类Dev

初始化大型std :: arrays时,编译器挂起

来自分类Dev

如何在不得到编译器警告的情况下初始化char * args []

来自分类Dev

Swift1.2编译器在结构初始化函数中的错误

来自分类Dev

复制初始化和显式构造函数-编译器差异

Related 相关文章

  1. 1

    为什么在某些优化级别上,编译器会警告未初始化的边缘迭代器?

  2. 2

    使用列表初始化时,C ++语言是否会强制执行编译器优化?

  3. 3

    为什么编译器不优化此初始化?

  4. 4

    现代C ++编译器会自动将局部变量初始化为0吗?

  5. 5

    为什么编译器会警告不要在初始化列表中隐藏成员?

  6. 6

    C ++(g ++编译器)动态初始化静态声明的数组会导致内存问题

  7. 7

    编译器可以正确处理静态变量的初始化顺序吗?

  8. 8

    C#编译器会优化此代码吗?

  9. 9

    编译器会优化未使用的链接文件吗?

  10. 10

    编译器会优化除法乘法吗

  11. 11

    Java编译器会优化基于静态变量进行条件化的静态函数吗?

  12. 12

    无法初始化编译器:在编译器镜像中找不到对象java.lang.Object

  13. 13

    编译器会优化条件中的双重逻辑否定吗?

  14. 14

    编译器会优化返回固定大小数组的结构的函数吗?

  15. 15

    编译器会优化返回固定大小数组的结构的函数吗?

  16. 16

    让编译器初始化数组或手动遍历数组以进行初始化是否更快?

  17. 17

    初始化多维数组时,编译器如何解释不完整的初始化列表?

  18. 18

    编译器无法识别std :: vector的成员初始化器

  19. 19

    Java编译器允许使用'this'关键字访问未初始化的空白final字段吗?这是一个错误吗?

  20. 20

    Java编译器会汇编吗?

  21. 21

    为什么编译器将此变量初始化为错误的值?这是对齐问题吗?

  22. 22

    编译器未检测到明显未初始化的变量

  23. 23

    Kotlin:“同步”使编译器不确定变量的初始化

  24. 24

    说服编译器数组的每个索引都将被初始化

  25. 25

    缩小转换和初始化列表的范围,哪个编译器正确?

  26. 26

    初始化大型std :: arrays时,编译器挂起

  27. 27

    如何在不得到编译器警告的情况下初始化char * args []

  28. 28

    Swift1.2编译器在结构初始化函数中的错误

  29. 29

    复制初始化和显式构造函数-编译器差异

热门标签

归档