답변
그것은 문자열 연결을 포함한 모든 상수 식을 미리 계산합니다 :하지 않으면 그것을 것 같이 정의됩니다. 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
상수 전파가 가장 일반적이고 쉬운 최적화 중 하나입니다.
여기에서 컴파일러가 최적화하는 것은 컴파일 타임에 알려진 값으로 1을 곱하는 것이 아니라 1을 곱하는 것입니다. 그래서 예, 컴파일러는 const
의 유무에 관계없이 예제의 모든 수학을 최적화합니다.
편집 :competent 컴파일러.
컴파일하고 디스 어셈블 한 후 비 const 표현식을 최적화하지 않았습니다. –
JIT가 런타임에이를 최적화 할 수 있습니까? –
@Neil Williams : JIT는 컴파일 타임에 알아낼 수있는 것들을 알아낼 수있는 장소가 아닙니다. –
모노 컴파일러에서 생성 된 코드를 보면 비 const가 포함 된 버전은 런타임에 곱하기를 수행합니다. 즉, 곱셈은 최적화되지 않습니다. const를 만들면 곱셈이 최적화됩니다.
Microsoft 컴파일러는보다 적극적인 컴파일러가있을 수 있습니다. 가장 좋은 해결책은 컴파일러에서 발생한 코드를보고 컴파일러가 수행중인 작업을 확인하는 것입니다.
const가 없어도 유능한 컴파일러는 'a'가 할당되고 사용되는 사이에 변경되지 않는다는 것을 알게됩니다. –
유능한 컴파일러가 그럴 수 있다고 가정 할 수는 있지만 어떤 이유로 든 int를 스택에 푸시하면 로컬 변수에로드 할 수 없게됩니다. –
최적화 여부에 관계없이 사용 했습니까? –