Class overhead in C++

Class overhead in C++

本文关键字:C++ in overhead Class      更新时间:2023-10-16

我有一个类,例如:

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对象传递给其他方法时,有多少开销?

如果将类拆分为头文件和源文件,并在其他编译单元中使用它,则由于调用构造函数,将会产生少量开销。

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

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

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

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

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

请注意,无法保证您的函数将被内联,但可能每个主要的编译器都能做到这一点。

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

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

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

但是,对于围绕核心类的这种薄包装器,即使在共享库方案中,编译器也会简单地调用核心方法,从而从调用站点中删除包装器类方法。