【发布时间】:2013-10-26 19:38:23
【问题描述】:
C++ 标准要求所有类型的大小至少为 1 个字节,即使结构没有成员也是如此。即
struct x { };
但是
sizeof(x) == 1
数组也是如此。声明零长度数组不符合标准(在 C、C++ 和 C99 中)。
int x[0]; // not allowed in C, C++ and C99 standards
那是为什么呢?对我来说,这似乎是一个不必要的要求,实际上引入了不一致。
我知道一些编译器允许零长度数组作为扩展,而且 C99 允许在结构末尾使用“零”长度数组,但它更像是一个可变长度数组,并且只能在一个结构。
所以我的问题是:在语言标准中禁止使用零长度数组或要求 sizeof > 0 的原因是什么?
【问题讨论】:
-
我怀疑是因为它会破坏
sizeof(T[N]) == sizeof(T) * N的身份。 -
加倍如此,因为
new T[0]是允许的,这是不同的,因为分配的数组没有附加编译时大小信息(你只得到一个指向第一个元素的指针)。跨度> -
为什么 sizeof(T[N]) == sizeof(T)*N ?我不确定我是否理解。假设 int x[0];然后我们有 sizeof(x) == 0 和 sizeof(x[0]) == sizeof(int)。那会有什么问题呢?
-
@AndreasH.:当他说
sizeof(T[N])时,我认为他的意思是T是一种类型。sizeof(x[0])是数组x的组件类型的大小,与sizeof(x[1])相同;sizeof(int[0])是一个错误。但假设它不是一个错误:它会是什么?它不能为 0,因为不允许 0 长度的对象,但如果它不是 0,那么它就不是 0*sizeof(int),打破了 sizeof(int[N]) 总是 N*sizeof(诠释)。至少,这是我对 G. 观点的解释。 -
Why is the size of an empty class in C++ not zero? 的可能副本。该标准要求
&T[1] - &T[0] == 1如果T的大小为零,则很难实现。