>백엔드 개발 >C++ >C 클래스 템플릿 멤버 함수에서 ODR 사용이란 무엇입니까?

C 클래스 템플릿 멤버 함수에서 ODR 사용이란 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-06 11:44:11980검색

What is ODR-Use in C   Class Template Member Functions?

C에서의 ODR-사용 이해

C 프로그래밍의 맥락에서 클래스를 논의할 때 "odr-use"라는 개념이 자주 등장합니다. 템플릿 멤버 함수.

단일 정의 규칙(ODR)은 전체의 모든 엔터티에 대해 하나의 일관된 정의가 있음을 보장합니다. 프로그램의 모든 번역 단위. ODR-use는 단순히 선언이 아닌 엔터티에 정의를 제공해야 하는 경우를 정의합니다.

C 표준에 따르면 오버로드되지 않은 함수는 다음과 같은 경우 odr-used입니다.

  • 해당 이름은 잠재적으로 평가된 표현식에 나타납니다.
  • 오버로드에 의해 선택된 후보 함수 집합의 구성원입니다. 해상도.
  • 비순수 가상 함수입니다.

ODR 사용 및 클래스 템플릿 멤버 함수

클래스 템플릿 멤버용 함수에서 ODR 사용 규칙은 해당 함수가 다음과 같은 경우에만 인스턴스화됨을 의미합니다.

  • 명시적으로 호출됩니다.
  • 가상 클래스 자체는 인스턴스화됩니다(함수가 호출되지 않더라도).

이 규칙은 다음을 보장합니다. 템플릿 멤버 함수는 실제로 필요할 때만 인스턴스화됩니다. 기본적으로 컴파일러는 사용되지 않는 멤버 함수를 인스턴스화하지 않아 컴파일 시간을 절약합니다.

ODR 사용 및 다중 컴파일 단위

여러 컴파일 단위를 사용할 때 컴파일러는 다음을 수행해야 합니다. odr에 사용된 모든 엔터티가 정확히 한 번만 정의되었는지 확인하세요. 이는 "기본 템플릿"이라는 개념을 통해 달성됩니다. 기본 템플릿은 번역 단위에서 템플릿의 첫 번째 인스턴스화입니다. 다른 번역 단위의 모든 후속 템플릿 인스턴스화는 보조 인스턴스화로 간주됩니다.

기본 템플릿은 ODR 사용 엔터티의 정의를 제공하는 역할을 합니다. 멤버 함수가 ODR로 사용되지만 기본 템플릿 내에서 호출되지 않는 경우에도 ODR을 충족하는 정의로 선언해야 합니다.

모든 멤버 함수 인스턴스화

클래스 템플릿을 명시적으로 인스턴스화하면 호출되지 않은 odr 사용 함수를 포함하여 모든 멤버 함수의 인스턴스화가 보장됩니다. 이렇게 하면 모든 컴파일 단위에 완전한 정의를 사용할 수 있어 잠재적인 연결 오류를 방지할 수 있습니다. 그러나 사용하지 않는 멤버 함수를 인스턴스화하는 것이 항상 필요하거나 효율적인 것은 아닙니다.

위 내용은 C 클래스 템플릿 멤버 함수에서 ODR 사용이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.