我一直认为,由sizeof
返回的类型为T
、元素数量为N的数组大小保证是恰好N乘以sizeof(T)
。
然而,在这个问题的评论区中,有声称数组可能包含填充的知名用户,这将破坏相等性。当然,这样的平台可能不存在,但它们是否被允许呢?
如果允许这样做,将会破坏许多常见的习语,例如使用N * sizeof(T)
计算数组所需的存储空间,或使用sizeof(a)/sizeof(a[0])
计算数组中元素的数量。
我一直认为,由sizeof
返回的类型为T
、元素数量为N的数组大小保证是恰好N乘以sizeof(T)
。
然而,在这个问题的评论区中,有声称数组可能包含填充的知名用户,这将破坏相等性。当然,这样的平台可能不存在,但它们是否被允许呢?
如果允许这样做,将会破坏许多常见的习语,例如使用N * sizeof(T)
计算数组所需的存储空间,或使用sizeof(a)/sizeof(a[0])
计算数组中元素的数量。
是的。 [expr.sizeof] 包含了关于 sizeof
的这一点:
当应用于数组时,结果是数组中所有字节的总数。这意味着包含 n 个元素的数组的大小是每个元素的大小乘以 n。
sizeof
的整个意义在于它包含了相关的填充。数组的每个元素都恰好比前一个元素多sizeof(T)
字节。因此,整个数组的大小为N * sizeof(T)
。
sizeof(T)
是否允许仅针对数组的额外填充。所有单独的对象都有填充,但标准是否允许数组本身具有超出元素填充之外的填充? - Daniel Hsizeof(T[N]) > N * sizeof(T)
,因此在末尾添加了额外的填充。C++标准对布局没有太多规定,只要额外的填充保持了T[N]
的对齐要求,这些要求至少需要与T
相同(我认为必须完全相同,但我不确定),那么就是允许的。 - Daniel Hsizeof
时,标准规定类类型的末尾可能会添加填充,并且为了将这些类型的对象放置在数组中,包括此填充在内的大小也会计入。在下一句话中,它讨论了应用于数组类型的 sizeof
,并且没有说这些数组类型的末尾可能会添加填充(这就是 @melpomene 引用的内容)。为什么要发明标准从未提到的东西呢? - n. m.
sizeof(T[N])
是N * sizeof(T)
的事实无关。 - Asad Saeeduddin