Ответ 1
GCC разрешает массивы нулевой длины как расширение: http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
и
Как причуда исходной реализации массивов нулевой длины, sizeof оценивается до нуля.
У меня есть два класса:
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??
GCC разрешает массивы нулевой длины как расширение: http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
и
Как причуда исходной реализации массивов нулевой длины, sizeof оценивается до нуля.
Ваш код плохо сформирован на языке С++. В частности, класс B
не должен компилироваться в компиляторе С++ Standard Conformant. Ваш компилятор имеет либо ошибку, либо предоставляет эту функцию как расширение.
GCC с -pedantic-errors -std=c++11
дает эту ошибку:
cpp.cpp:18:11: error: ISO C++ forbids zero-size array 'a' [-Wpedantic]
int a[];
^
Размер пустого класса не равен 1. Он AT LEAST 1 в системе С++.
Причина в том, что вам нужно иметь возможность, например, выделить экземпляр с new
и указав на него ненулевой указатель.
Второй случай вместо этого является просто недопустимым С++.
Часто производители компиляторов получают некоторую свободу, позволяя по умолчанию использовать нестандартные "расширения" и пытаться заставить вас использовать их бессознательно (параноик сказал бы, чтобы заблокировать вас, сделав ваш код неспособен к другим компиляторам).
может быть его, потому что в нем нет элементов, а когда вы даете ему 1 элемент, он показывает 4, который является размером одного целого.