C++내 연 허 함 수 를 어떻게 처리 합 니까?

함수 가 내 연 과 가상 함수 일 때 코드 교체 나 가상 표 호출 이 발생 합 니까?내 연 과 허 함 수 를 분명히 하기 위해 서,우 리 는 그것들 을 분리 해서 고려 합 시다.일반적으로 내 연 함 수 는 전개 된다.
여기,다음 코드 를 사용 하면:
        class CFoo {
private:
int val;
public:
int GetVal() { return val; }
int SetVal(int v) { return val=v; }
};
그러면 컴 파일 러 가 만 든 목표 코드 는 아래 코드 세그먼트 와 같 습 니 다.
        CFoo x;
x.SetVal(17);
int y = x.GetVal();
    val 은 개인 변수 이기 때문에 당연히 이렇게 할 수 없습니다.내 연 함수 의 장점 은 함수 호출 없 이 데 이 터 를 숨 길 수 있다 는 것 이다.
    허 함 수 는 다 태 성 이 있 는데 파생 된 클래스 가 같은 함 수 를 실현 할 수 있 음 을 의미 하지만 기능 은 다르다.GetVal 이 가상 함수 로 설명 되 고 두 번 째 방법 으로 이 루어 진 클래스 CFoo 2 가 있다 고 가정 합 니 다.
        CFoo x;
x.val = 17;
int y = x.val;
    pfoo 가 CFoo 나 CFoo 2 지침 이 라면 pfoo 가 어떤 종류의 CFoo 나 CFoo 2 를 가리 키 든 구성원 함수 pfoo->GetVal 을 호출 할 수 있 습 니 다.
    만약 함수 가 가상 함수 이자 내 연 함수 라면 어떤 상황 일 까요?내 연 함 수 를 만 드 는 두 가지 방법 이 있다 는 것 을 기억 하 세 요.
첫 번 째 는 함수 정의 에서 키워드 inline 을 사용 하 는 것 입 니 다.예 를 들 어:
두 번 째 는 클래스 성명 에서 함수 체 를 작성 하 는 것 입 니 다.앞의 CFoo 2:GetVal 과 같 습 니 다.따라서 가상 함수 체 를 클래스 의 성명 에 포함 시 키 면:
        class CFoo2 : public CFoo {
public: 
// virtual in base class too!
virtual int CFoo2::GetVal() { return someOtherVal; } 
};
    컴 파 일 러 는 이 함수 GetVal 이 내 연 된 것 이자 가상 이 라 고 생각한다.그렇다면 다 형 성과 내 연 특성 은 어떻게 동시에 일 할 수 있 을 까?
    컴 파 일 러 가 따 르 는 첫 번 째 규칙 은 무슨 일이 있어 도 다 태 성 은 반드시 작용 해 야 한 다 는 것 이다.CFoo 대상 을 가리 키 는 지침 이 있다 면 pfoo->GetVal 은 정확 한 함 수 를 호출 할 것 을 보증 합 니 다.일반적인 상황 에서 이것 은 함수 GetVal 이 비 내 연 함수 로 실례 화 되 고 vtable(가상 표)입구 가 그들 을 가리 키 는 것 이다.그러나 이것 은 이 함수 가 확장 되 지 못 한 다 는 것 을 의미 하지 않 는 다!다음 코드 를 보십시오.
        inline CFoo::GetVal() { return val; }        
    컴 파일 러 는 x 가 CFoo 가 아니 라 CFoo 2 라 는 것 을 알 고 있 습 니 다.이 대상 은 명시 적 으로 밝 혀 졌 기 때 문 입 니 다.x.CFoo 2 는 아 닐 거 야.그래서 SetVal/GetVal 내 연 을 펼 치 는 것 은 안전 합 니 다.복잡 한 코드 를 더 쓰 려 면:
        class CFoo {
public:
virtual int GetVal() { return val; }
};
컴 파일 러 는 pfoo 가 첫 번 째 로 x 를 가리 키 고 두 번 째 로 x2 를 가리 키 는 것 을 알 기 때문에 가상 함 수 를 전개 하 는 것 도 안전 하 다.
    더 복잡 한 코드 를 만 들 수도 있 습 니 다.그 중에서 pfoo 가 가리 키 는 대상 유형 은 항상 투명 하지만 대부분의 컴 파일 러 는 더 많은 분석 을 하지 않 습 니 다.앞의 예 에서 도 일부 컴 파일 러 는 안전하게 운행 되 고 예화 되 며 가상 표를 통 해 호출 될 것 이다.실제로 컴 파일 러 는 내 연 수 요 를 무시 하고 항상 가상 표를 사용한다.유일한 절대적 인 규칙 은 코드 가 반드시 작 동 해 야 한 다 는 것 이다.허 함 수 는 다 중 행동 이 있어 야 한 다 는 것 이다.
    보통 명시 적 이 든 암시 적 인 내 연 이 든 힌트 일 뿐 필요 한 것 이 아니 라 레지스터 와 같다.컴 파일 러 는 비 허 내 연 함 수 를 전개 하 는 것 을 완전히 거부 할 수 있 습 니 다.C+컴 파일 러 는 항상 먼저"내 연 중단-함수 가 너무 크다"고 잘못 보고 합 니 다.만약 내 연 함수 가 자신 을 호출 하거나 어 딘 가 에 주 소 를 전달 하면 컴 파일 러 는 정상 적 인(외 연?)을 만들어 야 합 니 다.함수내 연 함 수 는 DEBUG BUILDS 에서 펼 쳐 지지 않 으 며 컴 파일 옵션 을 설정 하여 예방 할 수 있 습 니 다.
    컴 파일 러 가 무엇 을 하고 있 는 지 알 고 싶 으 면,유일한 방법 은 그것 이 만 든 코드 를 보 는 것 이다.마이크로소프트 컴 파일 러 에 게 는-FA 컴 파일 옵션 으로 어 셈 블 리 목록 을 만 들 수 있다.너 는 어 셈 블 리 프로그램 이 어떻게 하 는 지 알 필요 가 없다.나 는 네가 이 실험 을 완성 하도록 격려 한다.이것 은 기계 가 실제로 하 는 일 을 이해 하 는 기계 에 유익 하 며,동시에 너 는 많은 어 셈 블 리 목록 중의 내용 을 배 울 수 있다.
    내 연 함수 에 관 한 것 은 네가 그것 을 처음 접 했 을 때 보다 훨씬 복잡 하 다.컴 파일 러 에 게 정상 적 인 함 수 를 만 들 도록 강요 하 는 경우 가 많 습 니 다.재 귀,함수 주 소 를 가 져 오고 너무 큰 함수 와 허 함 수 를 가 져 옵 니 다.그러나 컴 파 일 러 가 당신 의 내 연 함 수 를 실례 화하 기로 결정 한다 면 함 수 를 어디 에 두 어야 합 니까?그것 은 어느 모듈 에 들 어 갑 니까?
    보통 헤더 파일 에 클래스 가 설명 되 어 있 기 때문에 어떤 cpp 에 foo.h 가 포함 되 어 있 고 컴 파일 러 가 CFoo:GetVal 을 실례 화하 기로 결정 하면 cpp 파일 에서 정적 함수 로 실례 화 합 니 다.만약 10 개의 모듈 이 foo.h 를 포함한다 면 컴 파일 러 가 발생 하 는 가상 함수 복사 가 10 개 입 니 다.실제로 가상 시계 로 서로 다른 유형의 GetVal 을 가리 키 며 복사 할 수 있 으 며,같은 유형의 대상 에서 복사 만 생 성 된다.일부 링크 기 는 교묘 하 게 링크 할 때 번 거 로 움 을 제거 할 수 있 지만,일반적으로 너 는 그 가 보증 하 기 를 기대 할 수 없다.
    우리 가 얻 은 결론 은 내 연 허 함 수 를 사용 하지 않 는 것 이 좋 습 니 다.왜냐하면 그것 은 거의 전개 되 지 않 기 때 문 입 니 다.함수 가 한 줄 밖 에 없 더 라 도 다른 종류의 함수 와 함께 모듈(cpp 파일)에 두 는 것 이 좋 습 니 다.물론 개발 자 들 은 간단 한 가상 함 수 를 클래스 성명 에 넣 습 니 다.-이 함수 가 내 연 으로 전개 되 기 를 원 하 는 것 이 아니 라 더욱 편리 하고 가 독성 이 강하 기 때 문 입 니 다.

좋은 웹페이지 즐겨찾기