Каков размер этого класса и почему?

У меня есть два класса:

class A
{

};

class B
{
    int a[];
};


int main()
{
    cout << sizeof(A) <<endl;      //outputs 1
    cout << sizeof(B) <<endl;      //outputs 0
    return 0;
}

Мне известно, что размер пустого класса равен 1, но почему размер класса B становится ZERO??

Ответ 1

GCC разрешает массивы нулевой длины как расширение: http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

и

Как причуда исходной реализации массивов нулевой длины, sizeof оценивается до нуля.

Ответ 2

Ваш код плохо сформирован на языке С++. В частности, класс B не должен компилироваться в компиляторе С++ Standard Conformant. Ваш компилятор имеет либо ошибку, либо предоставляет эту функцию как расширение.

GCC с -pedantic-errors -std=c++11 дает эту ошибку:

cpp.cpp:18:11: error: ISO C++ forbids zero-size array 'a' [-Wpedantic]
     int a[];
           ^

Ответ 3

Размер пустого класса не равен 1. Он AT LEAST 1 в системе С++. Причина в том, что вам нужно иметь возможность, например, выделить экземпляр с new и указав на него ненулевой указатель.

Второй случай вместо этого является просто недопустимым С++.

Часто производители компиляторов получают некоторую свободу, позволяя по умолчанию использовать нестандартные "расширения" и пытаться заставить вас использовать их бессознательно (параноик сказал бы, чтобы заблокировать вас, сделав ваш код неспособен к другим компиляторам).

Ответ 4

может быть его, потому что в нем нет элементов, а когда вы даете ему 1 элемент, он показывает 4, который является размером одного целого.