C ++中的类开销

时间:2016-06-08 18:38:29

标签: c++ performance class oop

我有一个班级,例如:

class Vehicle {
  public:
    Vehicle(int handle);

    // Methods that use the handle e.g.:
    Color getColor() {
        return VEHICLE::GET_COLOR(handle);
    }

  protected:
    int handle;
};

我不知道这个例子是否对你有意义,但我围绕这些句柄构建了几个包装类,以获得更多OOP编码风格。

所以现在我的问题是,当我将Vehicle对象传递给其他方法时,有多少开销?

2 个答案:

答案 0 :(得分:2)

如果在头文件和源文件中拆分类并在其他编译单元中使用它,则由于调用构造函数而导致开销很小。

要解决此问题,必须将构造函数的定义放在头文件中,以便编译器可以内联它。

您可以通过更改类声明来执行此操作:

class Vehicle {
public:
    Vehicle(int handle)
     : handle(handle)
    {
    }
...

或将定义放在头文件中并使用inline关键字对其进行修饰。

class Vehicle {
public:
    Vehicle(int handle);
...
}

inline Vehicle::Vehicle(int handle)
 : handle(handle)
{
}

请注意,没有保证您的函数将被内联,但可能每个主要编译器都可以执行此操作。

另请注意,构造函数中的其他工作(例如handle - 1)也很可能导致开销。

如果您的班级是多态的或更大的,可能会有额外的开销。

答案 1 :(得分:0)

优化编译器将确保这种简单的调用转发没有开销。理想情况下,核心类(由包装器使用)应位于同一模块(DLL / SO)中,否则链接器/优化器可能几乎没有帮助。

但是,对于核心类的这种瘦包装器,即使在共享库场景中,编译器也只需调用核心方法,从调用站点中删除包装器类方法。