定义类型的成本/开销是多少?
What is the cost/overhead of defining a type?
在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,但在优化开始时无法保证这一点。这些问题最好通过实际测试手头的问题来解决。
在这里,您可以看到您的示例在这两种情况下生成相同的代码,即使没有优化也是如此。
相关文章:
- 实现无开销push_back的最佳方法是什么
- 复制列表初始化的隐式转换的等级是多少
- while循环中while循环的时间复杂度是多少
- 如何检查一个c++字符串中有多少相同的字符/数字
- C++有多少类型的循环
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 在条件变量中触发错误信号的频率是多少
- 定义类型的成本/开销是多少?
- 此操作在C++中通过引用进行修改的开销是多少
- 如果类没有任何成员变量,则通过临时对象调用类的成员函数的开销是多少?
- 每个对象内存分配有多少开销
- 与C 中的普通指针相比,智能指针的开销是多少
- 如果内部的总工作量相同,那么将for循环拆分为多个for循环的开销是多少
- 如果一类继承nsobject,则放置多少开销
- C++:contst static DEBUG 和 if 语句,实际的执行时间开销是多少
- shared_ptr线程安全的开销是多少?
- C++智能指针取消引用 - 检查它是否已初始化的开销是多少?
- 包装器函数的开销应该是多少?
- getaddrinfo()的时间开销是多少?
- 如果在保持相同类型的同时添加constness, static_cast运行时开销是多少?