템플릿 방법 디자인 패턴 다음과 같은 코드를 생각해인라인 개체 값의 의미가있는 방법 가상 함수
class A {
public:
void templateMethod() {
doSomething();
}
private:
virtual void doSomething() {
std::cout << “42\n”;
}
};
class B : public A {
private:
void doSomething() override {
std::cout << “43\n”;
}
};
int main() {
// case 1
A a; // value semantics
a.templateMethod(); // knows at compile time that A::doSomething() must be called
// case 2
B b; // value semantics
b.templateMethod(); // knows at compile time that B::doSomething() must be called
// case 3
A& a_or_b_ref = runtime_condition() ? a : b; // ref semantics
a_or_b_ref.templateMethod(); // does not know which doSomething() at compile time, a virtual call is needed
return 0;
}
컴파일러는 인라인/할 수 있는지 궁금하고는 "해봐요을 (unvirtualize) "멤버 함수를 사용합니다. templateMethod()에 대해 3 가지 다른 바이너리 코드를 생성하는 경우 가능합니다. 하나는 인라인이없고 다른 하나는 A :: doSomething() 또는 B :: doSomething() 인라인 (케이스 3, 1 및 2에서 각각 호출해야 함)
표준에 따라 최적화가 필요한지 알고 있습니까? 어떤 컴파일러가 그것을 구현한다면? 나는 CRT 패턴과 가상이 같은 종류의 효과를 얻을 수 있지만 그 의도는 명확하지 않다는 것을 알고 있습니다.
심지어 공격적인 최적화 컴파일러의 대부분이 정적 버전을 인라인으로 실패 나에게 보인다 ... 즉시 컴파일러를 변경 한 것이 아무 것도 표시했다 인라인 될 수없는 동일한 서명을 가진 함수의 예가 많이 있습니다. 예를 들어, fucions에서 외부 메모리에 액세스하는 경우 : 'cout << * p', 여기서 'p'는 클래스의 멤버입니다. doSomething()의 서명은 예제와 동일하지만 인라이닝을 수행 할 수 없습니다. 그러나 그것은 단지 의견 일뿐입니다. –
글쎄 어쩌면 내가 틀렸어.하지만 난 항상 어떤 기능도 기술적으로 인라인 될 수 있다고 생각했다. 가상이나 재귀가 아니라면 조건없이 인라인 될 수있다. 귀하의 예제에서 필자는 함수가 가상이 아닌 경우 컴파일러가 인라인 할 수없는 이유를 알지 못합니다. –
흠, 필자는 항상 인라인 코드를 직접 붙여 넣는 것이기 때문에 기술적으로 'cout << *(this-> p)'문자열을 가진 코드가 있습니다. 해당 코드에서 'this'포인터에 대한 정보가 필요하지만 인라인을 사용하면이를 놓칠 수 있습니다. 내가 잘못? –