《深度探索C++对象模型》学习笔记 — Function语义学(The Semantics of Function)
一、Member的各种调用方式
1、非静态成员函数
非静态成员函数将会被转化为非成员函数,其步骤如下:
(1)改写函数签名,在第一个参数的位置插入一个this指针。
(2)修改调用方式,将 -> 和 . 操作符的调用,改为对象地址的调用。
(3)使用name mangling为每个函数设置一个独一无二的签名。签名中应当包括:类名(为了区分继承中的函数重载),参数名,参数的引用和const标识等等
2、虚函数
虚函数的调用我们需要注意使用域作用符调用函数会抑制虚函数机制,这可以帮助我们提高效率:
#include "time.h"
#include <iostream>
using namespace std;
class CLS_Base
{
public:
int m_iMem1;
virtual void test()
{
m_iMem1++;
}
};
class CLS_Derived : virtual public CLS_Base
{
public:
virtual void test()
{
m_iMem1++;
}
virtual void testNoneVirtual()
{
CLS_Derived::test();
}
virtual void testVirtual()
{
test();
}
};
int main()
{
CLS_Derived *pDerived = new CLS_Derived;
time_t tStart = clock();
for (int i = 0; i < 1000000000; i++)
{
pDerived->testVirtual();
}
time_t tEnd = clock();
cout << "time = " << (tEnd - tStart) << endl;
tStart = clock