replacement_function — 대체 함수

replacement_function — 대체 함수 (Replacement functions)

구현이 정의를 제공하는 어떤 함수들을 **대체 가능(replaceable)**하다고 해요. C++ 프로그램은 대체 가능 함수의 시그니처로 정의를 제공할 수 있는데, 이를 **대체 함수(replacement function)**라고 불러요. 대체 함수가 제공되면, 구현이 제공하는 기본 버전 대신 그 대체 함수가 사용돼요. 이런 대체는 프로그램 시작 전에 일어나요.

예를 들어 전역 operator new를 직접 정의하면, 프로그램 전체의 동적 메모리 할당 동작을 바꿀 수 있어요. 이를 이용해 메모리 추적이나 커스텀 할당 정책을 구현할 수 있답니다.

출처: cppreference

본문

구현이 정의를 제공하는 어떤 함수들을 대체 가능하다고 해요. C++ 프로그램은 대체 가능 함수의 시그니처로 정의를 제공할 수 있는데, 이를 대체 함수라고 불러요. 대체 함수가 제공되면 구현이 제공하는 기본 버전 대신 그 대체 함수가 사용돼요. 이러한 대체는 프로그램 시작 전에 일어나요.

대체 함수 선언이 다음 조건 중 어느 하나라도 충족하지 않으면 프로그램은 잘못된 형식이고, 진단이 요구되지 않아요.

  • 인라인이 아닐 것
  • 전역 모듈에 첨부(attach)될 것
  • C++ 언어 연결(language linkage)을 가질 것
  • 대체 가능 함수와 같은 반환 타입을 가질 것
  • 대체 가능 함수가 표준 라이브러리 헤더에 선언되어 있다면, 그 헤더의 선언의 재선언으로 유효할 것

핵심 언어

C++26부터, 계약 위반 처리자 ::handle_contract_violation이 대체 가능한지는 구현 정의예요.

표준 라이브러리

다음 표준 라이브러리 함수는 대체 가능하며, 함수 의미론 설명은 C++ 표준 라이브러리가 정의한 기본 버전과 프로그램이 정의한 대체 함수 양쪽에 적용돼요.

  • operator new
  • operator delete
  • is_debugger_present

예제 (Example)

#include <cstddef>
#include <new>
#include <print>

// 대체 함수
void* operator new(std::size_t count)
{
    std::print("Replaced!");
    return nullptr;
}

int main()
{
    int* ptr = new int; // 프로그램이 정의한 대체 버전을 호출
}

출력:

Replaced!

new int 표현식이 operator new를 호출할 때, 프로그램이 정의한 대체 버전이 우선 호출돼요. 이처럼 대체 함수를 쓰면 표준 라이브러리의 특정 동작을 프로그램 차원에서 교체할 수 있어요.

더 알아보기 (Learn more)

cppreference