C#编译器是否计算常量的数学?

ama*_*ers 10 c# performance constants compiler-optimization

给出以下代码:

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

function GetX(int input) {
    int x = constA * constB * input;
    ...
    return x;
}
Run Code Online (Sandbox Code Playgroud)

.Net编译器会'替换'表达式并放置1000,所以计算不会一遍又一遍地重复吗?

在什么时候代码运行得最快:

  1. int x = constA * constB * input;
    
    Run Code Online (Sandbox Code Playgroud)
  2. int x = 10 * 10 * input;
    
    Run Code Online (Sandbox Code Playgroud)
  3. int x = 100 * input;
    
    Run Code Online (Sandbox Code Playgroud)

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

Dam*_*ver 16

C#常量表达式:

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

(还有更多要阅读的内容,如果你愿意的话)上面提到的"上面"是一个项目符号列表,包括:

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

和,

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

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


Lar*_*rry 8

我在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;
}
Run Code Online (Sandbox Code Playgroud)

IL是:

在此输入图像描述

十六进制64值(十进制100)是常量相乘的结果.mul操作是乘法input.

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