
首先,您需要了解可以将构造函数,析构函数和虚函数声明为内联函数,这在语法上是正确的.

如果以下代码正确,因为内联与register相同,因此仅是一个建议. 编译器不一定真正内联,也没有语法错误:

需要考虑的是构造函数,析构函数和虚拟函数是内联声明的,还是编译器确实是内联这些函数的?

让我们首先看一下构造函数和析构函数. 请参阅Effective C ++构造函数 内联,以了解将构造函数和析构函数声明为内联是没有意义的,也就是说,编译器并未真正声明并构造内联函数内联,因为编译器会添加其他操作(应用/释放内存,在构造函数和析构函数中构造/破坏对象等),以使构造函数/析构函数不像看上去那样精简.

有人认为虚拟函数被声明为内联,但是编译器没有内联它们. 他们给出的原因是构造函数 内联,内联是在编译时确定的,而虚函数是在运行时确定的,也就是说,在调用哪个函数的情况下,如何内联该函数?
以上观点看来是正确的,但事实并非如此. 如果在编译器可以决定调用哪个函数时可以内联虚拟函数,那么在什么情况下编译器可以确定要调用哪个函数,答案是何时使用对象在调用虚函数时,它会内联扩展.
总而言之,当指向派生类的指针调用声明为内联的虚函数时,它将不会内联扩展;当对象调用虚拟函数时,它将内联展开.
通过指针或引用引用对象时,无法内联对虚拟函数的调用,因为该调用必须动态解析. 原因: 编译器直到运行时(动态地)才知道要调用哪个实际代码,因为该代码可能来自于在调用者被编译之后创建的派生类.
因此,只有当编译器知道作为虚拟函数调用目标的对象的“精确类”时,才可以内联一个虚拟调用. 仅当编译器具有实际对象而不是指针或对对象的引用时,才会发生这种情况. 也就是说,可以是本地对象,全局/静态对象,也可以是复合材料内部完全包含的对象.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-200956-1.html
不惜一战
那我们就真的只剩下麻将了