C++ 프로그램을 개발할 때 코드의 크기가 커지면 컴파일 시간이 길어지고 실행 파일의 크기도 늘어날 수 있습니다. 이러한 문제를 해결하기 위해 코드를 적절히 분할하고 링크 타임 최적화를 수행하는 방법에 대해 알아보겠습니다.
코드 분할
C++ 프로그램을 여러 소스 파일로 나누는 것은 코드의 가독성을 높이고 유지 보수를 용이하게 합니다. 또한, 큰 프로젝트의 경우 전체 소스 코드를 한 번에 컴파일하는 것은 시간이 오래 걸릴 수 있습니다. 적절한 코드 분할은 이러한 문제를 해결할 수 있는데, 이를 위해 다음과 같은 방법을 사용할 수 있습니다.
Header 파일 사용
함수 및 클래스의 선언을 헤더 파일에 분리하여 필요한 경우에만 포함시킴으로써 컴파일 시간을 단축할 수 있습니다. 예를 들어, 다음과 같이 header.h
파일에 함수의 선언을 저장할 수 있습니다.
// header.h
#ifndef HEADER_H
#define HEADER_H
void function1();
void function2();
#endif
코드 모듈화
코드를 기능별로 모듈화하여 세분화된 파일로 분할하면, 변경된 부분만 재컴파일할 수 있습니다. 이를 통해 전체 프로젝트를 다시 빌드하는 시간을 단축할 수 있습니다.
// module1.cpp
#include "header.h"
void function1() {
// function1의 내용
}
// module2.cpp
#include "header.h"
void function2() {
// function2의 내용
}
링크 타임 최적화
링크 타임 최적화(Link-time Optimization, LTO)는 프로그램의 여러 모듈을 하나의 실행 파일로 결합할 때 최적화를 수행하는 기술입니다. LTO를 활용하면 컴파일러가 전체 프로그램을 고려하여 최적화를 수행하기 때문에 실행 속도를 높일 수 있습니다.
GNU 컴파일러에서 LTO 사용
GNU 컴파일러에서는 -flto
옵션을 사용하여 LTO를 활성화할 수 있습니다. 다음은 LTO를 적용한 컴파일 예시입니다.
g++ -flto -o output_file input_file1.cpp input_file2.cpp
MSVC 컴파일러에서 LTO 사용
MSVC 컴파일러에서는 /GL
옵션을 사용하여 LTO를 활성화할 수 있습니다. 다음은 LTO를 적용한 컴파일 예시입니다.
cl /GL /c input_file1.cpp
cl /GL /c input_file2.cpp
link /LTCG input_file1.obj input_file2.obj
코드 분할과 링크 타임 최적화를 통해 프로그램의 컴파일 시간을 단축하고 실행 파일의 크기를 최적화할 수 있습니다.
참고 문헌:
- https://en.cppreference.com/w/cpp/language/translation_phases
- https://docs.microsoft.com/en-us/cpp/build/reference/gltc-and-ltcg-link-options?view=msvc-160