定义类型的成本/开销是多少?

What is the cost/overhead of defining a type?

本文关键字:开销 多少 类型 定义      更新时间:2023-10-16

在C++中定义太多类型是否有任何运行时成本或开销?例如,这两段代码之间有什么区别吗:

int main()
{
int x, y;
double fx, fy;
return 0;
}

和:

template<typename T>
struct Point
{ 
T x, y;
};
int main()
{
Point<int> p;
Point<double> fp;
return 0;
}

想象一下,一个代码有许多模板化类型,因此在编译时它会生成更具体的类型:它会在运行时产生任何影响吗?我主要关心的是静态内存消耗。

在典型的实现中,没有 vtable 的类型实际上是自由的 - 它们在编译时完全不复存在,其中成员访问被转换为具有相关偏移量的内存的移出/移出。

具有vtable 的类型(因此,具有virtual方法的东西(确实在静态内存消耗方面具有 O(number_of_types( 成本,即每个类型都必须具有单独的 vtable/RTTI 数据,以及dynamic_cast导航复杂类层次结构所需的数据;在典型的实现中,您可以估算此成本,例如每个virtual方法 1 个指针 + 1 个指向 RTTI 信息的指针 + 损坏类的大小名称 + 一些指针连接dynamic_cast的数据结构。(这除了此类类型的每个实例中 vtable 指针的成本(

机器代码中没有类型这样的东西(除了RTTI的特殊情况(。因此,声明类型不会产生任何开销。

您的示例是相同的,因为它们都会导致一个完全不执行任何操作的程序,并且没有分配内存。程序不会使用这些变量,因此它们将被优化掉。

简单通常根本没有成本。如前所述,有些可能会产生一些运行时成本,例如 vtables 或 RTTI,但在优化开始时无法保证这一点。这些问题最好通过实际测试手头的问题来解决。

在这里,您可以看到您的示例在这两种情况下生成相同的代码,即使没有优化也是如此。