Program Club

C ++에서 생성자와 소멸자가 인라인 함수가 될 수 있습니까?

proclub 2020. 11. 11. 20:52
반응형

C ++에서 생성자와 소멸자가 인라인 함수가 될 수 있습니까?


VC ++는 클래스 선언 인라인 함수 내에서 구현되는 함수를 만듭니다.

Foo다음과 같이 클래스 선언 하면 CONSTRUCTOR 및 DESTRUCTOR 인라인 함수입니까?

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

{
    Foo f;
    (f);
}

생성자의 본문을 클래스 내부에 정의하는 것은 "inline"키워드를 사용하여 클래스 외부에 함수를 배치하는 것과 동일한 효과를 갖습니다.

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


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

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

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

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

그러나 실제로 함수를 인라인하는 경우 컴파일러에 달려 있습니다. VC ++는 인라인 요청을 거의 무시합니다. 좋은 생각이라고 생각하는 경우에만 함수를 인라인합니다. 최신 버전의 컴파일러는 링크 타임 코드 생성 을 사용하는 경우 별도의 .obj 파일에 있고 인라인으로 선언되지 않은 항목 (예 : 다른 .cpp 파일의 코드에서)도 인라인 합니다.

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


inline 키워드로 함수를 표시하는 것과 동일한 클래스 본문에 함수 정의를 넣습니다. 즉, 함수가 컴파일러에 의해 인라인 될 수도 있고 아닐 수도 있습니다. 그래서 가장 좋은 대답은 "어쩌면"일까요?


다른 함수를 인라인으로 만들 수있는 것과 같은 정도로 그렇습니다.


인라인 여부는 대부분 컴파일러에 의해 결정됩니다. 코드의 인라인은 컴파일러에 대한 힌트 만 제공합니다.
신뢰할 수있는 한 가지 규칙은 가상 기능이 인라인되지 않는다는 것입니다. 기본 클래스에 가상 생성자 / 소멸자가 있으면 아마 인라인되지 않을 것입니다.

참고 URL : https://stackoverflow.com/questions/21303/in-c-can-constructor-and-destructor-be-inline-functions

반응형