Раньше я был программистом на С++ в Windows. Я знаю, что компилятор оптимизирует тройной оператор в С++.
Код С++:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int result = argc > 3 ? 1 : 5;
printf("%d", result);
return 0;
}
Из-за материала конвейера сгенерированный собственный код показан ниже (конечно Release):
int result = argc > 3 ? 1 : 5;
00B21003 xor eax,eax
00B21005 cmp dword ptr [argc],3
00B21009 setle al
00B2100C lea eax,[eax*4+1]
Код С#:
namespace TernaryOperatorCSharp
{
static void Main(string[] args)
{
int argc = args.Length;
int result = argc > 1 ? 2 : 5;
System.Console.WriteLine(result);
}
}
Я искал собственный код JIT, но никакой оптимизации вообще (еще две инструкции перехода).
int result = argc > 1 ? 2 : 5;
0000002f cmp dword ptr [ebp-4],1
00000033 jg 0000003F
00000035 nop
00000036 mov dword ptr [ebp-0Ch],5
0000003d jmp 00000046
0000003f mov dword ptr [ebp-0Ch],2
00000046 mov eax,dword ptr [ebp-0Ch]
00000049 mov dword ptr [ebp-8],eax
System.Console.WriteLine(result);
0000004c mov ecx,dword ptr [ebp-8]
0000004f call 6A423CBC
Почему компилятор С# JIT не делает ту же оптимизацию, что и компилятор С++?
Какая история за этим?
Любая информация будет оценена.
Привет, Я изменил программу С# и запустил ее с помощью модели выпуска.
До
int result = args.Length > 1 ? 2 : 5;
Теперь
int argc = args.Length;
int result = argc > 1 ? 2 : 5;
Но результат все тот же. Существует еще две инструкции перехода. Я буду признателен, если будет дополнительная информация.