Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2012, 16:08   #1
Enchance
Пользователь
 
Регистрация: 20.10.2009
Сообщений: 23
По умолчанию c++ класс память

Здравствуйте.
Есть класс, в нем хранятся две переменные: однобайтовый char и четырехбайтовый int. sizeof говорит, что тот тип данных потребляет 8 байт.
Вопрос: куда девается еще 3 байта?
Может быть, это как-то связанно с тем, что у меня Windows x64?

Код:
#include <iostream>
using namespace std;

class car
{
   unsigned char type; unsigned int serial;
};

int main()
{
    cout << sizeof (car);
}
upd: На Windows 7 x86 то же самое.

Последний раз редактировалось Enchance; 01.02.2012 в 16:21.
Enchance вне форума Ответить с цитированием
Старый 01.02.2012, 18:13   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Так как класс содержит объект типа int, то происходит его выравнивание внутри класса, чтобы он расположился на границе, кратной размеру этого типа. Поэтому после объекта типа char добавляются три байта, чтобы обеспечить такое выравнивание. Но даже если вы в классе поменяете местами объект типа int с объектом типа char, то все равно размер вашего класса будет равен 8, так как компилятору нужно обеспечить, чтобы следующий объект вашего класса, если, допустим эти объекты будут объеденины в массив, также распологался на границе слова, так как объект класса начинается с размещения объекта типа int.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 02.02.2012, 15:07   #3
Enchance
Пользователь
 
Регистрация: 20.10.2009
Сообщений: 23
По умолчанию

В принципе, механизм понятен.
Только не понимаю, зачем это требуется. Если в разместить в классе 5 однобайтовых char-ов, то тип данных вполне спокойно будет занимать 5 байт.
Enchance вне форума Ответить с цитированием
Старый 02.02.2012, 16:17   #4
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от Enchance Посмотреть сообщение
В принципе, механизм понятен.
Только не понимаю, зачем это требуется. Если в разместить в классе 5 однобайтовых char-ов, то тип данных вполне спокойно будет занимать 5 байт.
Значит не все вы поняли. Размер объекта типа char составляет один байт, тоэтому и выравнивание идет по одному байту. А размер объекта типа int занимает машинное слово, поэтому и выравнивание происходит по границе слова. На 32-битовых машинах - это 4 байта.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 03.02.2012, 00:26   #5
Enchance
Пользователь
 
Регистрация: 20.10.2009
Сообщений: 23
По умолчанию

OK, спасибо.
Enchance вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
память offname C# (си шарп) 1 01.10.2011 10:33
Описать класс-родитель и класс-потомок. Delphi 7 Andrew_M Помощь студентам 0 15.01.2011 14:42
Динамическая память. spotmc13 Паскаль, Turbo Pascal, PascalABC.NET 5 20.09.2010 17:08
Память Ghennadiy Общие вопросы Delphi 9 25.08.2009 09:23