标签:派生 构造 观点 答案 寄存器 编译 strong 选择 effect
首先,将这些函数声明为内联函数,在语法上没有错误。因为inline同register一样,只是建议编译器这样操作,编译器并不一定真正的内联。
register关键字:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存 寻址访问,以提高效率
构造函数和析构函数声明为内联函数是没有意义的
《Effective C++》中所阐述的是:将构造函数和析构函数声明为inline是没有什么意义的,即编译器并 不真正对声明为inline的构造和析构函数进行内联操作,因为编译器会在构造和析构函数中添加额外的 操作(申请/释放内存,构造/析构对象等),致使构造函数/析构函数并不像看上去的那么精简。其次, class中的函数默认是inline型的,编译器也只是有选择性的inline,将构造函数和析构函数声明为内联 函数是没有什么意义的。
将虚函数声明为inline,要分情况讨论:
有的人认为虚函数被声明为inline,但是编译器并没有对其内联,他们给出的理由是inline是编译期决定 的,而虚函数是运行期决定的,即在不知道将要调用哪个函数的情况下,如何将函数内联呢?
上述观点看似正确,其实不然,如果虚函数在编译器就能够决定将要调用哪个函数时,就能够内联,那 么什么情况下编译器可以确定要调用哪个函数呢,答案是当用对象调用虚函数(此时不具有多态性) 时,就内联展开
综上,当是指向派生类的指针(多态性)调用声明为inline的虚函数时,不会内联展开;当是对象本身 调用虚函数时,会内联展开,当然前提依然是函数并不复杂的情况下
标签:派生 构造 观点 答案 寄存器 编译 strong 选择 effect
原文地址:https://www.cnblogs.com/crbhf/p/14939164.html