sizeof的成本是多少?

时间:2011-10-20 15:37:51

标签: c++

sizeof的费用是多少?

我希望:

  • sizeof(someclass)可以在编译时知道
  • sizeof(someStaticArray)可以在编译时知道
  • sizeof(someDynamicArray)可以在编译时

那最后一个案例是如何运作的?

7 个答案:

答案 0 :(得分:27)

C中的sizeof构造是一个完全编译时构造。没有运行时成本。

此规则至少有一个例外:可变长度数组。这些数组的大小在运行时计算,并且该大小可以重用于应用于它们的任何sizeof运算符。

请注意,可变长度数组和动态数组之间存在差异。在C99中添加了可变长度数组,它们支持sizeof运算符

答案 1 :(得分:7)

sizeof(dynamicArray)将返回sizeof(pointer),因为在c / c ++中,动态数组只是指针。

答案 2 :(得分:6)

在C ++中,最后一种情况不存在。 sizeof总是可以在编译时根据参数的类型进行评估,因此从不评估参数本身。

如果你想在C ++中使用类似动态数组的东西,通常会使用std::vector,在这种情况下会有运行时成本,但成本非常次要 - O (1)。 sizeofsome_vector.size()之间的速度差异很少相关。主要的一点是,由于size()不是常数,因此优化可能会有一些损失 - 例如,N/sizeof(short)通常会优化为右移而不是实际除法,因为{ {1}}是2的幂。由于编译器通常不会知道sizeof(short)是2的幂,因此在这种情况下它必须使用实际除法。同时,大多数CPU通过2的幂来优化除法,因此差异仍然非常小。

编辑(因为问题已被重新标记为C):C(自C99起)提供可变长度数组(VLA)和灵活数组成员(FAM)。对于可变长度数组,whatever.size()会评估其参数,因此存在(最小)运行时成本 - 大致相当于C ++中的sizeof。对于包含灵活数组成员的所有其他类型(包括std::vector::size()),struct不评估其操作数,因此没有运行时成本(与C ++中相同)。

对于具有灵活数组成员的sizeof:“结构的大小应等于其他相同结构的最后一个元素的偏移量,该结构用未指定长度的数组替换灵活数组成员。 “ (C99,§6.7.2.1/ 16)。

答案 3 :(得分:1)

sizeof在编译时评估类型的大小(仅评估表达式的类型),因此它没有运行时成本(就像你在那里放置一个常量一样) )。

由于指针引用动态数组,sizeof会告诉您指针的大小。通常,您必须手动跟踪动态数组的“实际”大小,没有支持的方法从分配器中了解它。

答案 4 :(得分:0)

sizeof是一个编译时调用。它只能用于编译时已知的事情。您的编译器将计算出结构的大小并替换数字常量。

答案 5 :(得分:0)

sizeof仅适用于编译时。动态数组将使用指向动态分配的内存的指针,该指针不会包含在结果中。你只会得到指针和管家信息的大小(数组长度等)。

答案 6 :(得分:0)

运行时成本为零。在动态分配内存的情况下,sizeof给出静态指针对象的大小,而不是动态分配的内存。