C++ sizeof的成本是多少?

C++ sizeof的成本是多少?,c++,C++,sizeof的成本是多少 我希望: sizeof(someclass)可以在编译时知道 sizeof(someStaticArray)可以在编译时知道 sizeof(someDynamicArray)可以在编译时不知道 那么最后一个案例是如何工作的呢?C中的sizeof构造完全是编译时构造。没有运行时成本 此规则至少有一个例外:可变长度数组。这些数组的大小是在运行时计算的,该大小将被应用于它们的任何sizeof运算符重用 请注意,可变长度数组和动态数组之间存在差异。C99中添加了可变长度数组

sizeof的成本是多少

我希望:

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

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

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

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

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


C++中,最后一个案例不存在。code>sizeof始终可以在编译时完全根据参数的类型进行计算,因此永远不会计算参数本身

如果你想在C++中使用动态数组,一般使用<代码> STD::vector < /代码>,在这种情况下,运行时花费会很低,但是代价非常小——O(1)。

sizeof
某些向量.size()之间的速度差异很少相关。主要的一点是,由于
size()
不是一个常数,因此可能会丢失一些优化的可能性——例如,
N/sizeof(short)
通常会优化为右移,而不是实际的除法,因为
sizeof(short)
是2的幂。由于编译器通常不知道
whater.size()
是2的幂,因此在这种情况下必须使用实际除法。同时,大多数CPU以2的幂优化除法,因此差异仍然很小

编辑(因为问题被重新标记为C):C(因为C99)提供了可变长度数组(VLA)和灵活数组成员(FAM)。对于一个可变长度数组, SsieOS
确实对其参数进行了评估,因此有一个(最小)运行时成本——大致相当于C++中的代码>:ST::vector:siz()/c++。对于所有其他类型(包括包含灵活数组成员的
struct
s),
sizeof
不计算其操作数,因此没有运行时开销(与C++中相同)


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

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

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

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

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

sizeof
在编译时计算类型的大小(仅计算表达式的类型),因此它没有运行时开销(就像在其中放置一个常量一样)


由于动态数组由指针引用,
sizeof
将告诉您指针的大小。一般来说,您必须手动跟踪动态数组的“实际”大小,没有支持的方法从分配器知道它。

如果我没有弄错的话,sizeof(dynamicArray)将只是sizeof(pointer),因为这都是动态数组are@DanF这是答案,不是评论:问题是C++的标记,如果C++中的内容相同,那么在你的答案中写出来就好了。@ TaskasyAPP我把问题作为C来解决,更合适。“JaradPar你也应该离开C++了。”另外,在阅读其他答案后,你陈述的后半部分似乎是错误的。使用sizeof无法获得动态数组的大小。@Dave可变长度数组和动态数组之间存在差异。可以获取可变长度数组的长度@哦,很有趣。我不知道。我仍然在这里等待C++中的完全C99遵从性。如果我有,例如,代码> SigeOf(浮点)< /C> >编译器将处理与<代码> 4 < /COD> > AAONFRANKE:是的,精确地说。