编译器在多大程度上改变了动态结合到静态

To what extent does a compiler change a dynamic binding to static?

本文关键字:动态 结合 静态 改变 程度 编译器      更新时间:2023-10-16
class base
{
public:
std::string name() { return basename; }
virtual void print(std::ostream &os) { os << basename; }
private:
std::string basename = "basen";
};
class derived : public base
{
public:
void print(std::ostream &os) override { base::print(os); os << " derivedn " << i; }
private:
int i;
};
int main()
{
// ex15.14
base bobj;
base *bp1 = &bobj;
base &br1 = bobj;
derived dobj;
base *bp2 = &dobj;
base &br2 = dobj;
// a.  this is an object, so compile time.
//bobj.print(std::cout);
// b.  this is an object, so compile time.
//dobj.print(std::cout);
// c.  function name is not virtual , so no dynamic
//     binding happens.so compile time
//std::cout << bp1->name();
// d.  function name is not virtual , so no dynamic
//     binding happens.so compile time
//std::cout << bp2->name();
// e.  run time
//br1.print(std::cout);
// f.  run time
//br2.print(std::cout);

return 0;
}

注意E和F,BR1和BR2是对基类对象BOBJ和派生类对象DOBJ的引用。一个好的C 编译器可以检测并优化代码,因此根本没有动态绑定过程?

是。如果编译器可以静态证明虚拟方法呼叫总是针对相同类型的对象(有时可以),则可以优化调用以不使用调度向量,而是静态地绑定到实际实现。

该分析通常是指指针分析的简单,不敏感,不敏感的变体,可以由编译器有效地运行。它自然不会检测到所有可能的优化点,但是很可能会击中明显的优化点。

这是一种重要的技术,用于有效地汇编始终使用动态调度的语言,例如Java。