我知道,当我们创建给定类类型的多个对象时,会创建成员变量的多个副本。每个对象都有其独立的成员变量集。成员函数是否也以相同的方式工作?如果我的班级有很多函数,那么每个创建的对象的成员函数都会重复吗?每个创建的对象是否都有自己的成员函数集?
class demo {
public:
int height;
int width;
void setheight(int height)
{
this->height = height;
}
void getArea() const
{
return height * width;
}
// 100 more member functions.
};
这只是一个假设的例子,用以证明有关C ++编译器的观点。实际上,这与我在项目中所做的事情有关。假设我有一个只有几个成员变量但有很多成员函数的类类型。如果我创建了该类类型的多个对象,我是否会重复编写代码,每个对象都有它自己的成员函数副本?在那种情况下,对我来说,最好将这些函数声明为以对象为参数的常规独立全局函数,而不是将其声明为参数,以避免增长可执行文件?
答案 0 :(得分:2)
这只是一个实现细节(标准并没有强制要求任何特殊性),但是几乎所有实现类方法实际上都是“常规”语法糖,自由函数以this
为隐藏对象参数 1 。 IOW,您建议的优化是编译器已经完成的工作。
虚拟方法涉及一些额外的机制,因为每个虚拟方法通常会“消耗”类(及其所有派生类)的vtable中的一个插槽,但同样,这是O(1)的空间成本,而不是O (n)个实例。
this
中接收ecx
而不是在堆栈中接收,因为如果它是一个以this
作为第一个参数的自由函数,则将是这样,但这与我们的讨论无关。