6

컴파일러는 곱셈을 1 씩 최적화합니까? 즉, 다음을 고려하십시오..NET 곱셈 최적화

식 5 * a는 5로 최적화됩니까? 이 컴파일 할 때

const int a = 1; 

답변

13

그것은 문자열 연결을 포함한 모든 상수 식을 미리 계산합니다 :하지 않으면 그것을 것 같이 정의됩니다. const이 없으면 혼자 남습니다.

첫 번째 예는이 IL로 컴파일 :

.maxstack 2 
.locals init ([0] int32, [1] int32) 

ldc.i4.1 //load 1 
stloc.0 //store in 1st local variable 
ldc.i4.5 //load 5 
ldloc.0 //load 1st variable 
mul  // 1 * 5 
stloc.1 // store in 2nd local variable 

두 번째 예는이로 컴파일 :

.maxstack 1 
.locals init ([0] int32) 

ldc.i4.5 //load 5 
stloc.0 //store in local variable 
+0

const가 없어도 유능한 컴파일러는 'a'가 할당되고 사용되는 사이에 변경되지 않는다는 것을 알게됩니다. –

+0

유능한 컴파일러가 그럴 수 있다고 가정 할 수는 있지만 어떤 이유로 든 int를 스택에 푸시하면 로컬 변수에로드 할 수 없게됩니다. –

+0

최적화 여부에 관계없이 사용 했습니까? –

1

상수 전파가 가장 일반적이고 쉬운 최적화 중 하나입니다.

0

여기에서 컴파일러가 최적화하는 것은 컴파일 타임에 알려진 값으로 1을 곱하는 것이 아니라 1을 곱하는 것입니다. 그래서 예, 컴파일러는 const의 유무에 관계없이 예제의 모든 수학을 최적화합니다.

편집 :competent 컴파일러.

+0

컴파일하고 디스 어셈블 한 후 비 const 표현식을 최적화하지 않았습니다. –

+0

JIT가 런타임에이를 최적화 할 수 있습니까? –

+0

@Neil Williams : JIT는 컴파일 타임에 알아낼 수있는 것들을 알아낼 수있는 장소가 아닙니다. –

1

모노 컴파일러에서 생성 된 코드를 보면 비 const가 포함 된 버전은 런타임에 곱하기를 수행합니다. 즉, 곱셈은 최적화되지 않습니다. const를 만들면 곱셈이 최적화됩니다.

Microsoft 컴파일러는보다 적극적인 컴파일러가있을 수 있습니다. 가장 좋은 해결책은 컴파일러에서 발생한 코드를보고 컴파일러가 수행중인 작업을 확인하는 것입니다.