在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;
}
想象一下有许多模板化类型的代码,因此在编译时它会生成更具体的类型:它是否会在运行时产生任何影响?我主要担心的是静态内存消耗。
答案 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您可以看到,即使没有优化,您的示例也会在两种情况下生成相同的代码。