给出以下代码:
const int constA = 10;
const int constB = 10;
function GetX(int input) {
int x = constA * constB * input;
...
return x;
}
.Net编译器会'替换'表达式并输入1000,这样计算就不会一遍又一遍地重复吗?
代码运行速度最快的是:
int x = constA * constB * input;
int x = 10 * 10 * input;
int x = 100 * input;
我猜选项3会比2更快但有时候不是最易读的选项。编译器是否识别这样的模式并相应地对其进行优化?
答案 0 :(得分:15)
每当表达式是上面列出的类型之一并且仅包含上面列出的结构时,表达式在编译时计算。即使表达式是包含非常量构造的较大表达式的子表达式,也是如此。
(还有更多要阅读的内容,如果你愿意的话)上面提到的“上面”是一个项目符号列表,包括:
- 引用类和结构类型的const成员。
和
- 预定义的+, - ,*,/,%,<<,>>,&,|,^,&&,||,==,!=,<,> ;,< =和> =二元运算符,前提是每个操作数都是上面列出的类型。
因此,要直接回答您的问题,是的,编译器将在编译时执行计算。
答案 1 :(得分: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;
}
IL是:
十六进制64值(十进制100)是常量相乘的结果。 mul操作乘以input
。
所以听起来应用于常量的操作是由编译器优化的。