5_2_虚函数.cpp
#include <iostream>
#include <memory>
using namespace std;
class A352
{
public:
int a = 0;
A352() {}
virtual void func() { }
void go() { cout << "go(). this=" << hex << this << endl; }
virtual ~A352() {}
};
class B352
{
public:
int b = 0;
B352() {}
virtual void bcd() {}
virtual ~B352() {}
};
class C352 : public A352, public B352
{
public:
int c = 0;
C352() {}
};
int main_3_5_2()
{
A352 a;
a.func(); // 直接调用,不会通过虚函数表
A352 *pa = new A352();
pa->func(); // 会通过虚函数表,然后再调用,此种方式性能会比普通函数调用差一点(会多出查询虚函数表的汇编代码)
void(A352::*pf)() = &A352::func;
cout << hex << (void *)(a.*pf) << endl; // linux中打印非静态函数的内存地址,静态函数的打印同理
((A352 *)0)->go(); // go(). this=0 ,若类普通成员函数中没有操作类的其他成员,那么可以使用这种方式调用,就像调用全局函数一样。
// 走虚函数表查找调用虚函数的就是多态
unique_ptr<B352> pu(new C352()); // 智能指针也可以多态。
A352 aa;
// RTTI ,可用dynamic_cast转换两个对象指针,若返回非空,表示转换成功,既这两个对象是有带虚函数的继承关系的。
// 若dynamic_cast转换的是引用,若这两对象之间不相同,也无带虚函数的继承关系,那么运行会报错。
B352 *pb = dynamic_cast<B352*>(&aa);
cout << (pb==nullptr) << endl;
return 0;
}
5_8_性能.cpp
#include "hjcommon.hpp"
using namespace std;
static uint64_t aFunc(int mv)
{
uint64_t count = 0;
for(int i=0; i<1000000; ++i)
{
count++;
if (i==1000 && mv==999) cout << "===" << endl; // 加上其他代码后,编译器就无法优化了,执行时间会大大增加
}
return count;
}
int main_3_5_8()
{
// 编译器优化
uint64_t count = 0;
auto start = getTimePoint();
for(int i=0; i<1000; ++i)
{
count += aFunc(i);
}
double time = hj::calcTimeCounts(start);
cout << count << ", " << fixed << time << endl;
return 0;
}