83

VC++ 生成在类声明内联函数中实现的函数。

如果我Foo如下声明一个类,那么是 CONSTRUCTOR 和 DESTRUCTOR 内联函数吗?

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

{
    Foo f;
    (f);
}
4

5 回答 5

81

在类内部定义构造函数的主体与使用“inline”关键字将函数置于类外部具有相同的效果。

在这两种情况下,它都是对编译器的提示。“内联”函数并不一定意味着该函数将被内联。这取决于函数的复杂性和其他规则。

于 2008-08-21T22:10:59.647 回答
34

简短的回答是肯定的。任何函数都可以内联声明,将函数体放在类定义中是一种方法。你也可以这样做:

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

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

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

但是,它是否真的内联函数取决于编译器。VC++ 几乎忽略了您的内联请求。如果它认为这是一个好主意,它只会内联一个函数。如果您使用链接时间代码生成,最新版本的编译器还将内联位于单独 .obj 文件中且未声明为内联的内容(例如,来自不同 .cpp 文件中的代码)。

您可以使用__forceinline关键字告诉编译器,当您说“内联此函数”时,您真的是认真的,但这通常是不值得的。在许多情况下,编译器确实最清楚。

于 2008-08-21T22:12:21.453 回答
5

将函数定义放在类体中相当于使用 inline 关键字标记函数。这意味着该函数可能会或可能不会被编译器内联。所以我想最好的答案是“也许”?

于 2008-08-21T22:11:43.327 回答
2

就像我们可以使任何其他函数内联一样,是的。

于 2008-08-21T22:12:26.697 回答
2

是否内联主要由您的编译器决定。代码中的内联仅提示编译器。
您可以信赖的一条规则是永远不会内联虚函数。如果您的基类具有虚拟构造函数/析构函数,则您的基类可能永远不会被内联。

于 2008-10-21T16:00:04.313 回答