sizeof的费用是多少?
我希望:
那最后一个案例是如何运作的?
答案 0 :(得分:27)
C中的sizeof
构造是一个完全编译时构造。没有运行时成本。
此规则至少有一个例外:可变长度数组。这些数组的大小在运行时计算,并且该大小可以重用于应用于它们的任何sizeof
运算符。
请注意,可变长度数组和动态数组之间存在差异。在C99中添加了可变长度数组,它们支持sizeof运算符
答案 1 :(得分:7)
sizeof(dynamicArray)
将返回sizeof(pointer)
,因为在c / c ++中,动态数组只是指针。
答案 2 :(得分:6)
在C ++中,最后一种情况不存在。 sizeof
总是可以在编译时根据参数的类型进行评估,因此从不评估参数本身。
如果你想在C ++中使用类似动态数组的东西,通常会使用std::vector
,在这种情况下会有运行时成本,但成本非常次要 - O (1)。 sizeof
和some_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给出静态指针对象的大小,而不是动态分配的内存。