12

给定以下代码:

const int constA = 10;
const int constB = 10;

function GetX(int input) {
    int x = constA * constB * input;
    ...
    return x;
}

.Net 编译器会“替换”表达式并输入 1000,这样计算就不会一遍又一遍地重复吗?

在什么情况下代码运行最快:

  1. int x = constA * constB * input;
    
  2. int x = 10 * 10 * input;
    
  3. int x = 100 * input;
    

我猜选项 3 会比 2 更快,但有时不是最易读的选项。编译器是否识别出这样的模式并相应地对其进行优化?

4

2 回答 2

19

C# 常量表达式

只要表达式属于上面列出的类型之一并且只包含上面列出的结构,就会在编译时计算表达式。即使表达式是包含非常量结构的较大表达式的子表达式,也是如此。

(如果您愿意,还可以阅读更多内容)提到的“以上”是一个项目符号列表,包括:

  • 对类和结构类型的 const 成员的引用。

和,

  • 预定义的 +、–、*、/、%、<<、>>、&、|、^、&&、||、==、!=、<、>、<= 和 >= 二元运算符,提供每个操作数属于上面列出的类型。

因此,要直接回答您的问题,是的,编译器将在编译时执行计算。

于 2013-02-07T13:47:26.177 回答
9

我在 LINQPad 中试过这个:

const int constA = 2;
const int constB = 50;

void Main()
{

    Console.WriteLine(GetX(12));
}

int GetX(int input) 
{
    int x = constA * constB * input;

    return x;
}

IL是:

在此处输入图像描述

十六进制 64 值(十进制为 100)是常数相乘的结果。mul 运算是乘以input

所以听起来像应用于常量的操作是由编译器优化的。

于 2013-02-07T13:51:00.413 回答