高质量程序设计指南c++/c语言(3)--c++编译器如何处理成员函数
在编译器眼中,同一个函数只存在一个实现,不管是全局函数还是成员函数。那么c++是如何处理类的成员函数的呢?实际上,c++通过name-mangling技术把每一个成员函数都转换成了名字唯一的全局函数,并把通过对象、指针或者引用对每一个成员函数的调用语句都改写成为相应的全局函数调用语句。每一个非静态数据成员函数都会被添加一个本类对象的指针作为第一个参数,这就是this指针的由来,然后再运用name-mangling技术处理。例如Rectangle类的SetLength成员函数被编译器改写后的样子可能是:
void _SetLength@Rectangle$2F&pf@GS(Rectangle *this, float length) //全局函数
{
this->m_length = length;
}
由此调用语句rec1.SetLength(100.5)被改写成 ::_SetLength@Rectangle$2F&pf@GS(&rec1, 100.5);
编译器对数据成员也会进行name-mangling处理。不同的c++编译器对class的成员函数、数据成员和全局函数的name-mangling方案是不同的,这是造成不同编译器之间连接兼容性的主要原因之一。