c# – 具有绝对返回路径的方法如何内联?
我主要使用C#开发,但我认为这个问题可能也适用于其他语言.此外,似乎这里有很多代码,但问题很简单.
根据我的理解,内联是编译器(在C#是虚拟机的情况下)通过在调用方法的每个位置插入方法体来替换方法调用. 假设我有以下程序: static Main() { int number = 7; bool a; a = IsEven(number); Console.WriteLine(a); } …方法的主体IsEven: bool IsEven(int n) { if (n % 2 == 0) // Two conditional return paths return true; else return false; } 我可以理解在内联方法后代码的样子: static Main() { int number = 7; bool a; if (number % 2 == 0) a = true; else a = false; Console.WriteLine(a); // Will print true if 'number' is even,otherwise false } 一个明显简单而正确的程序. 但是,如果我稍微调整一下IsEven的主体以包含绝对返回路径…… bool IsEven(int n) { if (n % 2 == 0) return true; return false; // <- Absolute return path! } 在某些情况下,我个人更喜欢这种风格.一些折射工具甚至可能会建议我将第一个版本更改为这个版本 – 但是当我试图想象这个方法在内联时的样子时我感到难过. static Main() { int number = 7; bool a; if (number % 2 == 0) a = true; a = false; Console.WriteLine(a); // Will always print false! } 要问的问题是: 编辑: 解决方法
它可能很难解释JITter在内联时所做的事情 – 它不会使C#代码变为内联 – 它将(总是?)处理生成的字节(编译版本) – 以及“工具”在生成汇编代码时(实际的机器代码字节)比C#(或者IL的代码)更精细.
也就是说,通过考虑break关键字,您可以在C#术语中了解它是如何工作的. 考虑这样一种可能性:每个内联函数都不是简单地包含在while(true)循环中(或者执行while(false)循环) – 并且每个源返回都被转换为localVar = result;打破;一套陈述.然后你得到这样的东西: static Main() { int number = 7; bool a; while (true) { if (number % 2 == 0) { a = true; break; } a = false; break; } Console.WriteLine(a); // Will always print the right thing! Yey! } 类似地,在生成程序集时,您将看到生成了大量的jmps – 这些是break语句的道德等价物,但它们更灵活(将它们视为匿名的getos或其他东西). 所以你可以看到,抖动(以及编译为本机的任何编译器)都有很多可以用来做“正确的事情”的工具. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |