Class overhead in C++
Class overhead in C++
我有一个类,例如:
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)中,否则链接器/优化器可能没有多大帮助。
但是,对于围绕核心类的这种薄包装器,即使在共享库方案中,编译器也会简单地调用核心方法,从而从调用站点中删除包装器类方法。
相关文章:
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- InitializeCriticalSectionEx Not Located In KERNEL32.Dll
- 将 lambda 表达式传递给 std::function in C++
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- std::async from std::async in windows xp