问题 C ++中带空数组的类的大小


AFAIK, sizeof 不应该回来 0,但以下程序:

#include <iostream>

class A {
public:
    int a[0];
};

int main() {
   A obj;
   std::cout << sizeof(obj) << std::endl;
}

输出 0。为什么?


6786
2017-09-21 19:40


起源

为什么你不期望它 0? - BartoszKP
@BartoszKP因为C ++标准禁止它。 - Konrad Rudolph
@Dukeling不,无论如何,代码都是非法的C ++。 - Konrad Rudolph
@Dukeling在严格符合代码中,是的,编译器必须禁止它。什么都没有禁止它作为一个 延期 但是,对于C ++。我不喜欢GCC默认启用这些扩展。 - Konrad Rudolph
@triclosan不,那不是真的。代码仍然是非法的。你谈到的零大小的基类优化确实存在,但这并不意味着 派生类' 大小可以是0。 - Konrad Rudolph


答案:


C ++不允许零大小的数组。符合标准的编译器拒绝代码,例如:

$ g++-4.8 -pedantic-errors main.cpp
main.cpp:5:14: error: ISO C++ forbids zero-size array 'a' [-Wpedantic]
       int a[0];
              ^

所以的行为 sizeof 这根本不相关。 GCC允许它(没有 -pedantic) 作为一个 编译器扩展


13
2017-09-21 19:53



+1:这可以在8.3.4§1中找到: “在声明中 T D [constant-expression] [..]常量表达式(5.19)存在,它应是一个整数常量表达式,其值应大于零“。 - Zeta
GCC中这个类的对象大小是多少?我想它的指针大小。它是什么? - hasan
@hasan讨论在这种情况下应该返回错误的实现是没有意义的。数组的大小不应为0 - BЈовић
你不是说gcc允许的吗? - hasan
所以在gcc中它没有错??! - hasan