是否为每个C ++对象编译了多个成员函数?

时间:2018-12-24 20:16:11

标签: c++ class compilation compiler-optimization

我知道,当我们创建给定类类型的多个对象时,会创建成员变量的多个副本。每个对象都有其独立的成员变量集。成员函数是否也以相同的方式工作?如果我的班级有很多函数,那么每个创建的对象的成员函数都会重复吗?每个创建的对象是否都有自己的成员函数集?

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 ++编译器的观点。实际上,这与我在项目中所做的事情有关。假设我有一个只有几个成员变量但有很多成员函数的类类型。如果我创建了该类类型的多个对象,我是否会重复编写代码,每个对象都有它自己的成员函数副本?在那种情况下,对我来说,最好将这些函数声明为以对象为参数的常规独立全局函数,而不是将其声明为参数,以避免增长可执行文件?

1 个答案:

答案 0 :(得分:2)

这只是一个实现细节(标准并没有强制要求任何特殊性),但是几乎所有实现类方法实际上都是“常规”语法糖,自由函数以this为隐藏对象参数 1 。 IOW,您建议的优化是编译器已经完成的工作。

虚拟方法涉及一些额外的机制,因为每个虚拟方法通常会“消耗”类(及其所有派生类)的vtable中的一个插槽,但同样,这是O(1)的空间成本,而不是O (n)个实例。


  1. 在某些实现中,调用约定也有所不同,例如在x86 VC ++上,方法是在this中接收ecx而不是在堆栈中接收,因为如果它是一个以this作为第一个参数的自由函数,则将是这样,但这与我们的讨论无关。