문제

컴파일러가 곱셈을 1 씩 최적화합니까? 즉, 고려 :

int a = 1;
int b = 5 * a;

표현 5 * a는 단지 5로 최적화됩니까? 그렇지 않은 경우 A가 다음과 같이 정의되면 다음과 같습니다.

const int a = 1;
도움이 되었습니까?

해결책

문자열 연결을 포함하여 컴파일 할 때 일정한 표현식을 미리 계산합니다. 없이 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

다른 팁

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

모노 컴파일러에서 생성 된 코드를 살펴보면, 비 초가 A가있는 버전은 런타임에 곱셈을 수행합니다. 즉, 곱셈은 최적화되지 않습니다. Const를 만들면 곱셈이 최적화됩니다.

Microsoft 컴파일러는보다 공격적인 컴파일러를 가질 수 있습니다. 가장 좋은 솔루션은 컴파일러에서 생성 한 코드를보고 그것이 수행하는 작업을 확인하는 것입니다.

컴파일러가 여기서 최적화하는 것은 1 인분의 곱셈이 아니라 컴파일 타임에 알려진 값으로 산술적입니다. 그렇습니다. 컴파일러는 예를 들어 있거나없는 예제의 모든 수학을 최적화합니다. const.

편집하다:능숙한 컴파일러, 말해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top