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 newoperator deleteis_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를 호출할 때, 프로그램이 정의한 대체 버전이 우선 호출돼요. 이처럼 대체 함수를 쓰면 표준 라이브러리의 특정 동작을 프로그램 차원에서 교체할 수 있어요.