2008-08-21 16 views
58

VC++는 클래스 선언 인라인 함수 내에서 구현되는 함수를 만듭니다.C++에서는 생성자와 소멸자가 인라인 함수가 될 수 있습니까?

다음과 같이 클래스 Foo을 선언하면 생성자 및 작성자 인라인 함수는 다음과 같습니다. 클래스 내부의 생성자의 몸을 정의

class Foo 
{ 
    int* p; 
public: 
    Foo() { p = new char[0x00100000]; } 
    ~Foo() { delete [] p; } 
}; 

{ 
    Foo f; 
    (f); 
} 

답변

57

은 "인라인"키워드와 클래스 외부 기능을 배치하는 같은 효과가 있습니다.

두 경우 모두 컴파일러에 대한 힌트입니다. "인라인"함수가 반드시 함수가 인라인된다는 것을 의미하지는 않습니다. 이는 기능 및 기타 규칙의 복잡성에 달려 있습니다.

+20

힌트 이상입니다. 인라인을 사용하면 둘 이상의 번역 단위에서 동일한 기능을 정의 할 수 있습니다. 이것은 호출 사이트 (링크 타임 최적화없이)에서 함수를 인라이닝하기위한 전제 조건이며, 키워드가 이름을 얻는 곳입니다. –

+3

@FredNurk @ FredNurk 나는 완전히 당신에게 동의한다. 그러나 Stroustrup 자신 (디자인과 C++의 진화)은 컴파일러에게 '힌트'인 'inline'에 대한 참조 자다. –

+0

위에서 언급했듯이,이 대답은 구식이다. [Here] (https://stackoverflow.com/a/44247740/509868)는 유사한 질문에 대한 최신 답변입니다. – anatolyg

2

인라인 키워드가있는 함수를 표시하는 것과 동일한 방식으로 클래스 정의를 본문에 넣습니다. 즉, 함수가 컴파일러에 의해 인라인 될 수도 있고 그렇지 않을 수도 있습니다. 그래서 가장 좋은 대답은 "어쩌면"이라고 생각하니?

25

짧은 대답은 '예'입니다. 모든 함수는 인라인으로 선언 할 수 있으며, 클래스 정의에 함수 본문을 두는 것이 한 가지 방법입니다. 또한 수행 할 수 있습니다.

class Foo 
{ 
    int* p; 
public: 
    Foo(); 
    ~Foo(); 
}; 

inline Foo::Foo() 
{ 
    p = new char[0x00100000]; 
} 

inline Foo::~Foo() 
{ 
    delete [] p; 
} 

그러나 실제로 함수를 인라인하는 경우 컴파일러가 결정합니다. VC++은 인라이닝에 대한 요청을 거의 무시합니다. 그것은 그것이 좋은 생각이라고 생각한다면 함수를 인라인 할 것입니다. 최신 버전의 컴파일러는 link time code generation을 사용하면 별도의 .obj 파일에 있고 인라인으로 선언되지 않은 항목 (예 : 다른 .cpp 파일의 코드)도 인라인으로 표시합니다.

__forceinline 키워드를 사용하면 컴파일러에서 "인라인이 함수"라고 말할 때 정말로 실제로 의미가 있음을 알 수 있지만 그만한 가치는 없습니다. 대부분의 경우 컴파일러는 실제로 가장 잘 알고 있습니다.

1

우리는 다른 모든 기능을 인라인으로 만들 수 있습니다. 그렇습니다.

1

인라인은 컴파일러에서 결정합니다. 코드의 인라인은 컴파일러에게만 힌트를줍니다.
믿을 수있는 규칙 중 하나는 가상 함수가 절대로 인라인되지 않는다는 것입니다. 기본 클래스에 가상 생성자/소멸자가 있으면 사용자는 아마 인라인되지 않습니다.

+0

btw, 가상 멤버 함수 (가상 소멸자 포함) 컴파일러에서 소멸되는 개체의 (전체) 유형을 알고있는 경우 인라인 될 수 있습니다. –