2014-02-07 2 views
4

나는 ClothingStore라는 클래스가 있다고 가정 해 보겠습니다. 이 클래스에는 3 개의 멤버 함수가 있으며, 이는 상점의 올바른 부서 방문자를 가리 킵니다. 멤버 함수는 ChildrenDept, MenDept 및 WomenDept이며 방문자가 자식인지, 남성인지, 여성인지에 따라 다릅니다.함수 오버로드가 런타임에 어떻게 작동하며 오버로드되는 이유는 무엇입니까?

함수 오버로드를 사용하면 PointToDept와 같은 이름을 가진 3 개의 함수를 만들 수 있지만 입력 인수 (자식, 남성, 여성)를 다르게 지정할 수 있습니다.

실제로 프로그램이 실행될 때 런타임에 어떤 일이 발생합니까?

내 생각에 컴파일러는 프로그램에 switch 문을 추가하여 올바른 멤버 함수를 선택합니다. 그러나 그것은 저에게 궁금합니다. - switch 문으로 자신 만의 함수를 만드는 대신 오버로드 된 함수를 사용할 때 프로그램 성능 측면에서 어떤 이점이 있습니까? 다시 말하면, 그 부분에 대한 유일한 결론은 코드 가독성입니다. 고맙습니다.

+11

컴파일러는 그들이 다른 이름이되었다 세 가지 기능 만있는 것처럼 본다. 어떤 함수를 호출 할지는 각 호출 사이트에서 인수의 유형과 매개 변수의 유형과 "패턴 일치"를 (컴파일러가) 조사한 것입니다. switch 문은 없습니다. 이 호출은 매개 변수가 일치하는 고유 함수에 대한 호출입니다. 컴파일러에서 일치 항목을 찾을 수 없으면 (오버로드 확인에 대한 C++ 규칙이 충족되지 않았기 때문에) 컴파일 타임 오류 메시지가 나타납니다. – Gene

+0

http : // ko를 참조하십시오.wikipedia.org/wiki/Ad_hoc_polymorphism#Early_binding –

+0

"왜 오버로드 되나요?" - 제공하는 데이터 유형이 변경 되더라도 오버로드 된 함수에 대한 호출을 변경할 필요가없는 클라이언트 코드를 작성할 수 있기 때문입니다. 이는 일반적인 클라이언트 코드에 편리합니다. 개발 또는 유지 관리 프로그래밍 중에 다른 유형을 사용하도록 발전하는 경우에 대비하여 클라이언트가 질문자 유형에서 호출자로부터 받아 들일 수있는 템플릿을 말할 때 매우 중요합니다. 템플릿에서 호출 할 수있는 경우 동일한 소스 코드를 사용하는 오버로드 된 함수, 다형성 (오버로드)의 한 형태는 다른 (템플릿)을 깨끗하게 지원합니다. –

답변

3

컴파일러는 서로 다른 이름을 가진 것처럼 세 가지 기능을 보입니다.

대부분의 컴파일러의 경우에는 이름이 다릅니다. 이것은 "이름 맹 글링 (name mangling)"이라고 불리는데, 함수 이름 앞에는 반환 유형이 붙고 매개 변수 유형 뒤에 접미사가 붙습니다.

http://en.wikipedia.org/wiki/Name_mangling

6

내 생각에 컴파일러는 올바른 멤버 함수를 선택하기 위해 프로그램에 switch 문을 추가합니다.

그건 잘못된 생각입니다. C++은 정적으로 타입 된 언어입니다. 변수의 유형은 런타임에 변경되지 않습니다. 즉, 호출 할 비 다형성 오버로드가 컴파일 타임에 항상 만들어 질 수있는 것인지 결정해야합니다. 표준의 13.3 절인 과부하 해결은 이러한 경우에 해당합니다. 컴파일 타임에 결정을 내릴 수있는 경우 런타임 결정을 할 이유가 없습니다. 대부분의 구현에서 비 다형성 오버로드 된 함수를 갖는 런타임 비용은 0입니다. 유일한 예외는 C++ 인터프리터 일 수 있습니다.

3

그것은 런타임

에서 기능 과부하 작동하지 않습니다 어떻게하지. 그것은 컴파일 타임에 작동합니다. 오버로드 된 함수에 대한 호출은 오버로드되지 않은 함수에 대한 호출과 런타임에서 다를 수 없습니다.

왜 과부하입니까? ... switch 문을 사용하여 함수를 직접 작성하는 대신 오버로드 된 함수를 사용할 때 프로그램 성능 측면에서 어떤 이점이 있습니까?

예. 'switch 문으로 자신 만의 함수를 만드는'것에 비해 런타임 오버 헤드가 전혀 없습니다.