Sizeof пустой структуры 0 в C и 1 в С++ почему?
Возможные дубликаты:
Пустой класс в С++
Каков размер пустой структуры в C?
Я где-то читал, что размер пустой структуры в С++ равен 1. Поэтому я подумал о ее проверке.
К сожалению, я сохранил его как файл C и использовал заголовок <stdio.h>
, и я был удивлен, увидев выход. Это было 0.
Это означает
struct Empty {
};
int main(void)
{
printf("%d",(int)sizeof(Empty));
}
печатал 0 при компиляции в виде файла C и 1 при компиляции в виде файла С++. Я хочу знать причину. Я читал, что sizeof пустой структуры в С++ не равен нулю, потому что если бы размер был равен 0, то два объекта класса имели бы тот же адрес, который невозможен. Где я ошибаюсь?
Ответы
Ответ 1
У вас не может быть пустой структуры в C. Это синтаксическое нарушение ограничений.
Однако gcc разрешает пустую структуру в C как расширение.
Кроме того, поведение undefined, если структура не имеет именованного члена, потому что
C99
говорит:
Если в списке struct-declaration-list нет именованных членов, поведение undefined.
So
struct Empty {}; //constraint violation
struct Empty {int :0 ;}; //no named member, the behaviour is undefined.
И да размер пустой структуры - это С++ не может быть нулем:)
Ответ 2
Есть несколько веских причин. В частности, это означает, что арифметика указателей над указателями на эту структуру не приводит к бесконечному циклу. Дополнительная информация:
http://bytes.com/topic/c/insights/660463-sizeof-empty-class-structure-1-a
Ответ 3
Вот замечательная статья, описывающая, почему это происходит, и, что более важно, (безопасный) путь вокруг него:)
http://www.cantrip.org/emptyopt.html