Оператор sizeof
представляет собой конструкцию времени компиляции, с помощью которой компилятор сообщает размер в байтах, который экземпляр данного типа будет занимать в памяти.
Трудно дать общий ответ "это то, как работает sizeof", потому что он специфичен для каждой реализации компилятора.В general , хотя он работает путем вычисления размера каждого поля типа и сложения их вместе с учетом выравнивания.
Например, вот разумный набор выходных данных [1]
struct S1 {
int field1;
int field2;
};
struct S2 {
int field1;
bool field2;
int field3;
}
sizeof(S1) == 8
sizeof(S2) == 12;
Причина, по которой многие компиляторы сообщают размер S2
как 12, а не 9, заключается в том, что он должен учитыватьпроблемы выравнивания и, следовательно, вставки 3 байта, чтобы восполнить разрыв между field2
и field3
[1] Примечание: я сказал, что разумно, а не гарантировано :).Компиляторы C обладают большой гибкостью в размерах, и практически невозможно указать конкретные размеры, не зная компилятор, с которым вы работаете