2015-02-02 2 views
1

클래스의 메소드가 인라인 될 확률을 생각할 때 Vector 클래스 (수학적 의미로는 std::vector 의미가 아닙니다)를 작성했습니다. 함수 정의 방법에 따라 다릅니다.함수가 C++에서 정의 된 위치에 따라 인라인 될 가능성

나는 다음과 같은 경우에 관심이 :

사례 1이, 함수 본문은 헤더 파일에 선언의 장소에서 정의된다. 예 :

// Vector.h 
class Vector 
{ 
public: 
    // Other stuff up here 

    float Magnitude(void) const 
    { 
     return sqrt(X*X + Y*Y); 
    } 

    // Other stuff down here 
} 

사례 2이 함수 본문 초기 클래스 정의 후의 헤더 파일에 정의되어있다. 예 :

// Vector.h 
class Vector 
{ 
public: 
    // Other stuff up here 

    float Magnitude(void) const; 

    // Other stuff down here 
} 

// Other stuff up here 

float Vector::Magnitude(void) const 
{ 
    return sqrt(X*X + Y*Y); 
} 

// Other stuff down here 

사례 3은 함수 바디 선언 및 정의 별도두고 대응 .cpp 파일에서 제공된다. 예 :

// Vector.h 
class Vector 
{ 
public: 
    // Other stuff up here 

    float Magnitude(void) const; 

    // Other stuff down here 
} 

//Vector.cpp 
#include "Vector.h" 

// Other stuff up here 

float Vector::Magnitude(void) const 
{ 
    return sqrt(X*X + Y*Y); 
} 

// Other stuff down here 

케이스 4는, 함수 정의 컴파일러 입력으로 제공된 대응 .lib 파일에서 제공된다.

사례 5의 경우 함수 정의는 연결된 .dll 파일에 제공됩니다.

이 5 가지 경우 각각에서 함수가 인라인 될 확률은 얼마입니까? 정확한 확률을 의미하지는 않습니다. 서로 비교하면 인라인 될 확률이 높고 가능성이 적습니다.

기타 정보 :

내가 의도적으로 너무 넓은되지 않도록 문제를 단순화하기 위해 inline 키워드를 무시하고있다. 나는 인라이닝을 다루는 다른 많은 질문이 있다는 것을 알고 있지만,이 질문에 특히 대처하기 위해 각 사례에 대한 충분한 정보를 찾지 못했습니다. 또한 미리 만들어진 벡터 클래스가있는 라이브러리가 이미 있다는 것을 알고 있습니다. 이는 연습의 요점이 아닙니다.

답변

1

대부분 컴파일러에 의존하기 때문에 모든 기능을 인라인 할 수 있습니다.

1) 첫 번째 경우에만 inline 키워드를 추가 할 때 자동으로 인라인 함수를 시도하므로 중복됩니다.

2) 사례 2에서 inline 키워드를 추가 한 다음 일 수도 있고 일 경우 인라인됩니다. (컴파일러에 따라 달라집니다)

3) .lib.dll의 코드가 이미 컴파일되어 있기 때문에 함수 4를 사용할 수있는 방법이 없습니다. (.dll은 런타임에만로드됩니다.)

또한 많은 컴파일러가 적합한 함수를 자동으로 인라인 할 수있는 옵션을 지원합니다 (-O3 : gcc).