gpt4 book ai didi

c++ - 编译器在多大程度上将动态绑定(bind)更改为静态绑定(bind)?

转载 作者:太空狗 更新时间:2023-10-29 20:35:33 26 4
gpt4 key购买 nike

class base
{
public:
std::string name() { return basename; }
virtual void print(std::ostream &os) { os << basename; }
private:
std::string basename = "base\n";
};

class derived : public base
{
public:
void print(std::ostream &os) override { base::print(os); os << " derived\n " << 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++ 编译器是否可以为此检测和优化代码,从而根本没有动态绑定(bind)过程?

最佳答案

是的。如果编译器可以静态证明虚方法调用总是以相同类型的对象为目标(有时它可以),则允许优化调用以不使用分派(dispatch) vector ,而是静态绑定(bind)到实际实现。

这种分析通常是指针分析的一种简单、上下文无关、流无关的变体,可以由编译器高效地运行。它自然不会检测到所有可能的优化点,但很有可能会找到明显的优化点。

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

关于c++ - 编译器在多大程度上将动态绑定(bind)更改为静态绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42298470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com