2008-08-21 180 views

回答

57

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

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

+20

这不仅仅是一个提示:内联允许您在多个翻译单元中定义相同的功能。这是在呼叫站点内联功能的前提条件(没有链接时优化),这是关键字获取它的名字的地方。 – 2010-12-01 11:42:00

+3

@FredNurk我完全同意你的观点 - 然而Stroustrup自己(C++的设计和发展)引用了`inline`作为编译器的'提示' – 2014-05-14 10:02:58

2

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

25

简短的回答是肯定的。任何函数都可以声明为inline,并且将函数体放入类定义中是实现此目的的一种方法。你也可以这样做:

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

内联与否主要由您的编译器决定。内联代码只对编译器提示。
可以指望的一条规则是虚拟函数永远不会被内联。如果你的基类有虚拟的构造函数/析构函数,你的内核可能永远不会被内联。

相关问题