【发布时间】:2011-10-13 18:20:53
【问题描述】:
我已经阅读了Are inline virtual functions really a non-sense?。但是我还是有些疑惑,没有找到答案。
他们说如果情况不模棱两可,编译器应该内联虚函数。
但是:
只有当编译器有一个实际对象而不是指针或对象引用时才会发生这种情况。
如果我有一个从A 派生的B 类(其中包含virtual void doSth() 函数)并且我使用B* 指针,而不是A*:
B* b = new B;
b->doSth();
- 假设
B没有任何子类。 (在编译时)应该调用什么函数是相当明显的。所以可以内联。是真的吗? - 假设
B有一些子类,但这些类没有自己的doSth()函数。所以编译器应该“知道”唯一要调用的函数是B::doSth()。我猜它没有内联?
【问题讨论】:
-
我敢打赌,这取决于编译器,您只需查看生成的程序集即可找到答案。你用的是什么编译器?
-
其实这是一个关于编译器的问题。大卫,海湾合作委员会。
-
它的版本是
4.4.1。您认为在 1. 和 2. 情况下内联足够聪明吗? -
真正的问题是,即使编译器也能检测到指针的静态类型,为什么还要在堆上分配
B?为什么程序员也不能这样做?
标签: c++ compiler-construction virtual inline