1
136
虚拟函数有时可以内联。优秀的摘录 C++ faq :
|
2
67
添加了C++ 11
|
3
35
有一类虚拟函数在其中仍然有内联的意义。考虑以下情况:
删除“base”的调用将执行虚拟调用以调用正确的派生类析构函数,此调用未内联。但是,由于每个析构函数调用它的父析构函数(在这些情况下为空),编译器可以内联 那些 调用,因为它们实际上不调用基类函数。 对于基类构造函数或派生实现也调用基类实现的任何函数集,都存在相同的原则。 |
4
14
我见过一些编译器,如果根本不存在非内联函数,它们就不会发出任何v-table(然后在一个实现文件中定义,而不是在头文件中定义)。他们会像
实际上,这不符合标准,但是它确实发生了,因此考虑将至少一个虚拟函数不在头中(如果只有虚拟析构函数的话),以便编译器可以在该位置为类发出vtable。我知道有些版本的
正如有人提到的,内联虚拟函数可以是一个好处
有时
,但当然,最常使用的是
不
了解对象的动态类型,因为这是
但是编译器不能完全忽略
|
5
10
嗯,实际上
虚拟函数始终可以内联
,只要它们静态链接在一起:假设我们有一个抽象类
低血压电话
我们仍然需要RTTI
|
6
3
内联的 真的什么都没做-这是个提示。编译器可能会忽略它,或者它可能在没有 内联的 如果它看到了实现并喜欢这个想法。如果代码清晰性受到威胁, 内联的 应该移除。 |
7
3
内联声明的虚函数在通过对象调用时是内联的,在通过指针或引用调用时被忽略。 |
8
3
将虚拟方法标记为内联,有助于在以下两种情况下进一步优化虚拟函数: |
9
1
有了现代编译器,它不会对输入它们造成任何伤害。一些古老的编译器/链接器组合可能已经创建了多个vtables,但我不认为这是一个问题了。 |
10
1
如果函数调用是明确的,并且函数是一个合适的内联候选函数,那么编译器就足够聪明,可以无论如何内联代码。 剩下的时间“inline-virtual”是胡说八道,实际上有些编译器不会编译这些代码。 |
11
0
编译器只能在编译时明确解析调用时内联函数。 但是,虚拟函数是在运行时解析的,因此编译器无法内联调用,因为在编译类型时无法确定动态类型(因此也无法确定要调用的函数实现)。 |
12
0
创建虚拟函数,然后在对象上调用它们,而不是在引用或指针上调用它们,这是有意义的。Scott Meyer在他的《有效C++》一书中建议,永远不要重新定义继承的非虚函数。这是有道理的,因为当你用一个非虚函数生成一个类并在派生类中重新定义该函数时,你可能会确保自己正确地使用它,但是你不能确保其他人会正确地使用它。另外,你以后可能会错误地使用它。所以,如果您在基类中创建一个函数,并且希望它是可重定的,那么您应该使它成为虚拟的。如果创建虚拟函数并在对象上调用它们是有意义的,那么内联它们也是有意义的。 |