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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2013, 10:20   #1
stpdqstns
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 33
По умолчанию Как определить размер структуры

Здравствуйте. Читаю из файла куски данных, которые записываю в объект структуры:
Код:
some_stream.read(reinterpret_cast<char*>(&struct_obj), sizeof(struct_object));
Сама структура:
Код:
struct Data
	{
		char ID[4];
		unsigned int size;
		unsigned short flags;
	};
sizeof(struct_obj) должен быть вроде = 4 + 4+ 2 = 10; Но C++, говорит, что 12. Объясните, пожалуйста, почему?

p.s. может быть подобная тема есть, но мобильный интернет не позволяет нормально поюзать поиск
stpdqstns вне форума Ответить с цитированием
Старый 30.01.2013, 10:25   #2
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Скорее всего идет выравнивание структур данных на 4 байта
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 30.01.2013, 10:39   #3
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

http://en.wikipedia.org/wiki/Packed
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 30.01.2013, 10:51   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Вариант 1 - выравнивание по 4 байта.
Вариант 2 - sizeof(short)==4.
Abstraction вне форума Ответить с цитированием
Старый 30.01.2013, 11:45   #5
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Какие варианты? Вы о чем? Я ж даже ссылку дал... Это же есть и хелпе, и в мсдн.
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 30.01.2013, 11:58   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Какие варианты? Вы о чем? Я ж даже ссылку дал... Это же есть и хелпе, и в мсдн.
И? У Вас есть уверенность, что дело именно в том, что используемый ТС (неизвестный) компилятор при используемых ТС (неизвестных) настройках выравнивает структуры?

Ответ на вопрос ТС - sizeof(struct_obj) не "должен" быть равен чему-то конкретному. Стандарт C++ для большинства типов не задаёт строго их размер - это раз и не гарантирует, что sizeof для структуры равен сумме sizeof для всех членов, явно указанных в её объявлении - это два.
Abstraction вне форума Ответить с цитированием
Старый 30.01.2013, 13:07   #7
stpdqstns
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 33
По умолчанию

Использую Microsoft Visual C++ 2010. Ezhik Kihze, спасибо за ссылку.
Код:
#pragma pack(push)  /* push current alignment to stack */
#pragma pack(1)     /* set alignment to 1 byte boundary */
 
struct MyPackedData
{
    char ID[4];
    unsigned int size;
    unsigned short flags;
};
 
#pragma pack(pop)   /* restore original alignment from stack */
код, помог, но я не совсем могу понять, почему.. С английским не очень хорошо дела обстоят. Происходит некое выравнивание границы, но механизм всего этого не понятен. Почему при
Код:
#pragma pack(2)
, результат как при
Код:
#pragma pack(1)
.
Однако весьма непростая тема.
stpdqstns вне форума Ответить с цитированием
Старый 30.01.2013, 13:17   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Происходит некое выравнивание границы, но механизм всего этого не понятен.
Если упростить, то механизм выражается одной фразой: "если структура должна иметь размер S, где S не делится на текущий параметр выравнивания p, дополнить её пустыми байтами до минимального размера, делящегося на p".
Но, ещё раз - стандарт C++, если не изменяет память, предоставляет ровно одну гарантию: sizeof(char)==1. Всё остальное зависит от реализации, и не всегда очевидным образом. Скажем, размер такой структуры
Код:
struct EmptyStruct {
};
скорее всего окажется равен 1.
Abstraction вне форума Ответить с цитированием
Старый 30.01.2013, 14:52   #9
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Цитата:
результат как при
Правильно, ведь 10 (размер ваших полей) нацело делится и на 1, и на 2... и дополнять не надо.
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 30.01.2013, 18:33   #10
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Код:
struct EmptyStruct {
};
скорее всего окажется равен 1.
Если такая структура будет иметь размер.. то будут проблемы с памятью.
Я проверил и у меня просто вышибло прогу.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить размер физического диска? Robin_ Общие вопросы Delphi 7 18.01.2016 07:11
Как программно определить размер текущей БД? Swatch Microsoft Office Access 2 18.10.2012 21:32
Как в Delphi определить размер файла? Nomad Помощь студентам 7 10.08.2010 08:33
Как определить размер скрытого объекта? rolling JavaScript, Ajax 7 28.09.2009 19:39
Как определить размер кадра в AVI sun Общие вопросы C/C++ 1 18.11.2007 06:00