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

时间:2017-07-04 08:40:40

标签: c++ types

在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;
}

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

3 个答案:

答案 0 :(得分:5)

在典型的实现中,没有vtable的类型几乎是免费的 - 它们在编译时完全不存在,其中成员访问被转换为具有相关偏移的从/到内存的移动。

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

答案 1 :(得分:1)

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

您的示例是相同的,因为它们都会导致程序完全没有任何内容,没有分配内存。程序不使用变量,因此它们将被优化掉。

答案 2 :(得分:0)

简单通常没有任何费用。如前所述,有一些可能会产生一些运行时costa,比如vtable或RTTI,但是当优化开始时,这并不能保证。这些问题最好通过实际测试手头的问题来解决。

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

相关问题