2016-08-16 2 views
1

컴파일러가 메모리 개체의 상대 위치에 대해 어떤 가정을하는지 궁금합니다.메모리 개체의 상대 위치에 대한 컴파일러 가정

예를 들어 크기가 각각 1 바이트 인 두 개의 스택 변수를 할당하고 0과 함께 둘 다 초기화하는 경우 컴파일러는 메모리의 두 바이트를 모두 0으로 덮어 쓰는 단일 명령 만 내보내고이 경우를 최적화 할 수 있습니다. 컴파일러는 두 변수의 상대 위치를 알고 있습니까?

내가 특별히 더 잘 알려진 GCC 같은 컴파일러, g ++, 그 소리는 Windows C /에 관심이 C++ 컴파일러 등

+2

수 있습니까? 물론 네. 그럴거야? 시도해보십시오. –

답변

1

하나에 여러 할당을 최적화 할 수 있습니다 컴파일러 .

a = 0; 
b = 0; 

는 미묘한 부분은 뭔가

*(short*)&a = 0; 

처럼 될 수도 당신이 정말로 할 수 없기 때문에 그 "우리가 바로 다른 후 크기가 1 바이트 각각 두 개의 스택 변수를 할당 할 경우". 컴파일러는 스택 위치를 마음대로 돌릴 수 있습니다. 또한 단순히 변수를 선언한다고해서 반드시 스택 할당을 의미하는 것은 아닙니다. 변수는 레지스터에있을 수 있습니다. C에서는 alloca을 사용해야하며 "바로 다음에"제공하지는 않습니다.

더욱 일반적으로 C 표준에서는 다른 개체의 메모리 위치를 비교할 수 없습니다. 이것은 정의되지 않은 동작입니다.

+0

C 표준이이를 정의되지 않은 동작으로 정의하는 경우 gcc는 표준을 준수하며 이와 같은 최적화를 사용하지 않습니까? – user2600312

+1

@ user2600312 그런 식으로 코드를 사용하면 정의되지 않은 동작이됩니다. 컴파일러는 특정 방법으로 특정 대상에 대해 컴파일하기 때문에 알 수있는 작동을 알면 수행 할 수 있습니다. * 작동 가능 * 할 수 있습니다. – harold

관련 문제