2012-08-23 49 views
1

写在.h文件中的函数和右后(隐式内联)的执行,而使用虚拟关键字:隐式内联虚函数头实现

virtual void g(){cout<<"is Inline?"}; 

是虚拟的功能意义,因为该功能在.h中执行? 这是否被认为是内联?

+2

'inline'和'virtual'无关... – Synxis

+1

@Synxis,不是真的。假设存在一个'虚拟'函数层次结构,并且它们使用指针/引用来调用。然后它将限制编译器将它们的内容替换为这些函数调用(典型的宏样式内联)。 – iammilind

+0

@iammilind:但是'inline'与函数的任何特定用法是否内联无关(除了编译器可能使用它作为提示)。这意味着函数在每个使用它的翻译单元中定义,这与它是否是虚拟无关。 –

回答

7

虚拟功能是没有意义的,因为函数是在.h中实现的吗?

virtualinline是完全独立的概念。

virtual表示根据调用的对象的动态类型,在运行时根据需要选择要调用的函数。

inline意味着您可以在多个翻译单元中定义该功能,并且必须在使用它的任何翻译单元中对其进行定义。对于某些编译器来说,这是必要的,以允许内联函数,但不会强制所有调用被内联。特别是,虚拟调用通常不会内联(除非动态类型可以在编译时确定),所以virtual在这里肯定会保留其含义。

这是否被认为是内联?

是的,但是(如上所述)并不意味着所有的调用都会被内联。

1

虚拟功能是没有意义的,因为在.h中实现的功能是 。

没有。没有理由感到如此。对头文件进行预处理并将其复制粘贴到任何位置。所以最终它和在任何.cpp文件中实现g()一样好。

这是否被认为是内联?

。但是这里的inline并不意味着用其内容替换函数调用的通常解释。功能解析发生在运行时,因此绝对不能以(宏观样式)方式内联。
这意味着,编译器保证只为所有翻译(.cpp文件)单元生成1个定义。因此,链接器不会抱怨多个定义错误。

+1

'inline'具有与其他地方完全相同的含义。编译器应该尝试内联实现函数。有时它不能;在虚拟函数的情况下,当然,如果它不知道对象的动态类型,它(可能)不能。 –

+0

@JamesKanze:另外,如果类不是多态使用,编译器可以安全地内联,如果可以的话。 –

+0

@JamesKanze,phresnel;不能保证'inline'的通常含义(用其文本替换函数调用)。这是编译器的决定。另一方面,即使该函数没有声明为“inline”,编译器仍然有权将其函数调用替换为其文本。两者都是编译器相关的'inline'唯一保证的作用是保护ODR。 “ – iammilind

0

如果您声明功能virtual,它是虚拟的,句号。但是,由于虚拟功能通常是在运行时选择的,通常编译器将无法将它们内联。如果你在一个对象上调用函数,编译器可能会内联它,因为调用可以在编译时解析。但它不能通过引用或指针内联一个调用,因为它无法在编译时解析动态类型。

考虑到inline关键字不是隐式内联对于编译器来说是强制性的;他们只是建议。但virtual关键字是强制性的。