[c++] 코드 분할과 링크 타임 최적화

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

코드 분할과 링크 타임 최적화를 통해 프로그램의 컴파일 시간을 단축하고 실행 파일의 크기를 최적화할 수 있습니다.

참고 문헌: