我有一个班级,例如:
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
对象传递给其他方法时,有多少开销?
答案 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)中,否则链接器/优化器可能几乎没有帮助。
但是,对于核心类的这种瘦包装器,即使在共享库场景中,编译器也只需调用核心方法,从调用站点中删除包装器类方法。