2013-08-26 5 views
-1

Так что я в настоящее время студент и имею программирование couse.Почему sizeof показывает 4 байта для символа?

Сегодня мы имели об использовании SizeOf в различных классах (если он имел 1 или 2 Int int's и так далее)

Одна часть примера я нашел странным было это:

class TwoIntAndACharClass 
{ 
public: 
    int x_; 
    int y_; 
    char z_; 
}; 

и часть, чтобы проверить его

TwoIntAndACharClass o3b; 
cout << "Sizeof TwoIntAndACharClass   = " << sizeof(o3b) << "\n"; 

Таким образом, в программе я мог видеть класс с 1 полукокса занимает 1 байт. Поэтому, когда я увидел это, я подумал, что увижу 9 байтов и не 12

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

Чтобы быть на 100% уверенным, что это правда, я попытался добавить новую переменную в класс (двойную переменную 8 байтов), а общий размер увеличился с 12 до 24 байтов. Это означает, что char теперь должен был быть 8 байтов, поэтому моя последняя теория не удалась.

Моя последняя теория заключалась в том, что она приняла бы самую большую уже объявленную переменную и использовала бы ее размер для переменной char _z, поскольку это работало как с длинным длинным int (8 байтами), так и с двойным (также 8 байтами)

Итак, мой вопрос в том, является ли моя последняя теория истинной - или это что-то другое, заставляя char брать больше памяти, чем необходимо? (мой учитель сказал, что каждый компилятор может справиться с этим по-другому, но я попробовал его на визуальной студии Microsoft, а другой попробовал его на другом компиляторе с теми же результатами, но это правда, так это то, как это обрабатывается компилятором?)

Извините за мой плохой английский.

+0

Два слова: ошибка округления. Ну, не совсем «ошибка», но размеры структур округляются по-разному (и поля внутри структуры переустановлены) в соответствии с компилятором, ОС и ЦП. Вы можете объявить структуру «упакованной», чтобы предотвратить это, хотя с некоторой опасностью страшного «неопределенного поведения». –

+1

Зачем вам задавать вопрос: «Почему sizeof показывает 4 байта для символа», *, когда вы не пробовали использовать 'sizeof' на' char'? Разве вам не приходило в голову, что это может быть полезным экспериментом? ;) – jalf

+0

Попробуйте добавить еще один символ в конец структуры. Сколько раз вы можете сделать это до изменения размера класса? –

ответ

7

sizeof дает размер структуры, а не сумму размеров ее членов. Из-за требований к выравниванию (int s обычно нравится выравниваться по естественным границам, 4 байта на большинстве платформ), компилятор будет разбивать структуру на 12 байтов, так что когда у вас есть несколько экземпляров структуры, смежных друг с другом (например, в массив), они остаются правильно выровненными.

Большинство компиляторов имеют собственное пользовательское расширение для контроля заполнения, например. #pragma pack в компиляторе Microsoft.

Смежные вопросы