본문 바로가기

개발/C++

컴파일러 최적화

visual studio에서 Debug모드와 Release모드로 구성할 수 있음

 

 

예제 코드

#include "pch.h"
#include <iostream>
#include <thread>
#include <Windows.h>

int i = 0;
int k = 0;

void Func1()
{
	while (true)
	{
		if (i == 1) {
			//std::cout << "Func1()" << std::endl;
			k++;
		}
	}
}

void Func2()
{
	while (true)
	{
		Sleep(1000);
		std::cout << "Func2() " << k << std::endl;
		i++;
		i %= 2;
	}
}

int main()
{
	std::thread thread1(Func1);
	std::thread thread2(Func2);
	thread1.join();
	thread2.join();
}

Release모드 결과

Debug모드 결과

 

왜 이런 결과가 나오냐 하면 visual studio 옵션에서 Release모드는 컴파일 최적화가 일어나게 설정이 돼있다. (옵션에서 변경 가능)

 

그래서 최적화가 될 때 무슨 일이 일어나냐?

 

컴파일러가 볼 때 사용하지 않는 부분을 삭제하게 됨

 

코드에서 i를 보면 멀티스레드로 값을 변경하고 있는 것을 볼 수 있음

 

하지만 컴파일러는 그것을 알지 못하는 것 같음

 

컴파일러가 보기에 i는 0의 값이 들어있는데 Func1에서 i == 1을 체크하고 있음

 

그럼 컴파일러가 발생하지 않는 코드로 인식해 해당 코드를 삭제하고 컴파일됨

 

아마도 실제 컴파일 결과는

void Func1()
{
	while (true);
}

같은 모양으로 만들었을 것임

 

 

이런 일을 방지하기 위해선 volatile 키워드를 추가해주면 최적화 대상에서 배제됨