>백엔드 개발 >C++ >가상 기본 클래스가 없는 클래스의 생성자가 GCC 컴파일 코드에서 중복되어 나타나는 이유는 무엇입니까?

가상 기본 클래스가 없는 클래스의 생성자가 GCC 컴파일 코드에서 중복되어 나타나는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-16 16:01:03231검색

Why do constructors for classes without virtual base classes appear duplicated in GCC-compiled code?

생성자 기호의 이중 방출

문제 이해

GCC 컴파일 코드에서 가상 기본 클래스가 없는 클래스의 생성자가 라이브러리에 중복되어 나타날 수 있습니다. 목록을 작성하여 이러한 행동의 이유에 대한 질문을 제기합니다. 자세히 설명하자면, Itanium C ABI는 생성자를 포함하여 C 기호에 대한 일련의 명명 규칙을 정의합니다.

ABI 구문 분석

이러한 생성자의 잘못된 이름을 살펴보겠습니다.

  • _Z3fooEv: Thing용 생성자::foo()
  • _ZN5ThingC1Ei: Thing(int)
  • _ZN5ThingC2Ei: Thing(int)
  • 에 대한 기본 객체 생성자 _ZN5ThingC1Ev: Thing()
  • 에 대한 완전한 객체 생성자 _ZN5ThingC2Ev: Thing()

에 대한 기본 객체 생성자 보시다시피 생성자는 C1(완전 객체 생성자)으로 구분됩니다. 및 C2(기본 개체 생성자) 접미사.

다양한 생성자

이 이중성은 다형성 지원에서 비롯되지만 이 경우에는 반드시 필요한 것은 아닙니다. 완전한 개체 생성자는 가상 기본 클래스를 추가로 초기화하는 반면, 기본 개체 생성자는 데이터 멤버와 비가상 기본 클래스를 초기화합니다.

다중 정의

라이브러리 목록에 여러 항목이 있음에도 불구하고 이러한 중복 생성자는 "기호 __의 다중 정의" 오류가 발생하지 않습니다. 이는 ABI가 각 생성자 유형에 고유한 잘못된 이름을 제공하여 링커에서 고유한 기호로 처리되도록 하기 때문입니다.

결론

GCC 컴파일 코드에서 생성자 기호의 이중 방출 다형성 지원과 Itanium C ABI 명명 규칙의 결과입니다. 이러한 개념을 이해하면 이러한 동작의 이유를 밝히고 다양한 정의에 대한 우려를 해결할 수 있습니다.

위 내용은 가상 기본 클래스가 없는 클래스의 생성자가 GCC 컴파일 코드에서 중복되어 나타나는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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