sizeof的成本是多少?

Dav*_*vid 15 c++

sizeof的成本是多少?

我希望:

  • sizeof(someclass)可以在编译时知道
  • sizeof(someStaticArray)可以在编译时知道
  • sizeof(someDynamicArray)在编译时无法识别

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

Jar*_*Par 28

sizeofC中的构造是完全编译时构造.没有运行时成本.

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

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

  • @Dave可变长度数组和动态数组之间存在差异.您可以获得可变长度数组的长度.http://en.wikipedia.org/wiki/Sizeof (2认同)

Dan*_*n F 7

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


Jer*_*fin 6

在C++中,最后一种情况不存在.sizeof始终可以在编译时根据参数的类型进行评估,因此永远不会评估参数本身.

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

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

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