编译器在多大程度上改变了动态结合到静态
To what extent does a compiler change a dynamic binding to static?
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。
相关文章:
- 多态性和功能结合
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 控制允许动态运行c++的并发操作数
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 输出没有重复元素的动态数组(收缩数组)C++
- C++为线程工作动态地分割例程
- 正在插入动态数组
- C++结合静态和动态多态性来创建"Hyper Polymorphism"?
- 编译器在多大程度上改变了动态结合到静态
- 根据C 中的参数,动态结合到功能
- 如何将 etrace 与动态库结合使用,以按时间顺序跟踪 C++ 中的函数调用
- 将动态内存分配与C++库结合使用
- 如何将动态铸造与variadics结合使用
- 结合了静态多态性和动态多态性