成员函数的调用效率
# 成员函数的调用效率
C++成员函数的调用和普通函数调用有相同的效率。
C++的设计准则之一就是:非静态成员函数至少必须和一般的非成员函数有相同的效率。
也就是说,使用成员函数不会带来额外的负担。
编译器内部已经将成员函数实例转化成了对等的非成员函数实例。这个过程就涉及到了this 指针。
成员函数实例转化成了对等的非成员函数实例步骤:
- 改变函数签名,增加一个额外的形参,用于提供一个存取的管道,使得类的对象能够调用此函数,这个额外的形参就是this 指针。这里不得不提到一点,成员函数被放置到类对象空间之外,只有一份,那么不同对象调用成员函数就是利用了这个this 指针:
void Person::SetAge(int age);
// 将成员函数实例转化成了对等的非成员函数实例,如下:
void Person::SetAge(Person* const this, int age);
1
2
3
2
3
- 对每个非静态成员函数的存取操作都是通过 this 指针来完成的。
- 编译器对函数进行符号修饰,使得这个函数名称独一无二。
// 通过nm工具查看符号表
_ZN6Person6SetAgeEi
1
2
2
obj.SetAge(5);
1
转换成:
_ZN6Person6SetAgeEi(&obj, 5);
1
在实际成员函数的调用栈中,我们也会发现 this 指针的存在,this 指针通常是作为第一个函数参数。
上次更新: 2022/06/17, 07:22:19