4 November 2024

C++ 캐스팅, 탬플릿과 컴파일 관계

by 꽈배기

1. C++의 template 키워드와 C#의 Generic 키워드의 차이점 (컴파일, 링커, 런타임 기준)

C++의 template

템플릿 인스턴스 테이블

C#의 Generic

차이점

2. constexpr가 내부적으로 어떤 동작을 하는지 설명

constexpr는 C++11에서 도입된 키워드로, 컴파일 타임 상수 표현식을 정의하는 데 사용됩니다. constexpr 함수나 변수는 컴파일 타임에 평가될 수 있는 표현식을 나타냅니다.

3. template가 오버헤드를 일으키는 이유

C++ 템플릿은 강력한 기능을 제공하지만, 몇 가지 오버헤드를 일으킬 수 있습니다:

4. 템플릿과 제너릭의 인스턴스화 시점

템플릿 (C++):

제너릭 (Java, C#):

JIT와 제너릭의 관계:

정리:

C++ 템플릿 빌드가 느려지는 이유

1. 템플릿 인스턴스화:

각 번역 단위에서 템플릿이 사용될 때마다 컴파일러는 해당 템플릿의 인스턴스를 생성합니다. 이는 각 번역 단위에서 독립적으로 발생합니다.

2. 중복 생성:

여러 번역 단위에서 동일한 템플릿 타입을 사용하면, 각 번역 단위에서 동일한 템플릿 인스턴스가 중복 생성됩니다.

3. 링커 단계에서의 중복 제거:

링커는 여러 번역 단위에서 생성된 동일한 템플릿 인스턴스를 감지하고 중복을 제거합니다. 이 과정은 다음과 같습니다: a) 각 템플릿 인스턴스의 심볼(symbol)을 비교합니다. b) 동일한 심볼을 가진 인스턴스들을 찾아냅니다. c) 중복된 인스턴스 중 하나만 남기고 나머지는 제거합니다. d) 제거된 인스턴스를 참조하던 코드를 남은 인스턴스로 리다이렉트합니다.

4. 컴파일 시간 증가:

이 과정에서 컴파일 시간이 증가하는 이유는 다음과 같습니다: a) 각 번역 단위에서 템플릿 인스턴스화에 시간이 소요됩니다. b) 링커가 모든 템플릿 인스턴스를 비교하고 중복을 찾는 데 시간이 필요합니다. c) 중복 제거 과정에서 심볼 테이블을 수정하고 참조를 업데이트하는 데 시간이 소요됩니다.

Case_1

  1. 동일한 템플릿 타입을 1000개의 번역 단위에서 호출하는 경우:
    • 각 번역 단위에서 동일한 템플릿 인스턴스가 생성됩니다 (총 1000개).
    • 링커는 이 1000개의 인스턴스 중 999개를 제거해야 합니다.
    • 중복 제거 횟수: 999번

Case_2

  1. 다른 템플릿 타입을 1000번 정의 후 호출하는 경우:
    • 각 템플릿 타입에 대해 별도의 인스턴스가 생성됩니다 (총 1000개의 서로 다른 인스턴스).
    • 각 인스턴스가 고유하므로 링커는 중복 제거를 수행하지 않습니다.
    • 중복 제거 횟수: 0번
tags: C++