Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для ZiminAS1990
2 / 2 / 0
Регистрация: 27.07.2012
Сообщений: 31

Не очевидное смещение к полям структуры

12.08.2012, 23:55. Показов 1495. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток!

Столкнулся с непонятным мне вопросом... у меня есть структура:
C
1
2
3
4
struct A {
  uint16_t x;
  uint32_t y;
}
Я предполагал, что в памяти она будет хранится как массив из 6ти байт:

0 ---------> +2
+----------+------------+
| x(2байта) | y(4 байта) |
+----------+------------+

Однако sizeof говорит, что структура имеет размер 8 байт, а в памяти она хранится в таком виде:

0---------> +2-----------> +4
+----------+-------------+----------+
| x(2байта) | ??(2 байта) | y(4байта) |
+----------+-------------+----------+

Почему так, и с чем это связано? С выравниванием памяти, или с чем?

Проблема в том, что я с одной стороны создаю массив из 6ти байт и заполняю его, а с другой - принимаю этот массив и накладываю на него данную структуру... естественно, что получаю совсем другие числа в полях структуры, чем те, которые ожидаю....

Благодарю за ответы.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.08.2012, 23:55
Ответы с готовыми решениями:

Структуры, массивы структур (как можно присваивать(инициализировать) значения полям структуры)
Есть у меня вот такая структура, например struct Subject { int cost; int Volume; }; Потом создаю экземпляр, Subject G; ...

Смещение полей структуры
Как можно узнать смещение поля структуры относительно адреса структуры? Если просто сложить размеры предыдущих элементов, то результат...

Цикл по полям структуры
Даны следующие структуры // информация public struct Info { .... public Phone phone; } // структура телефона public...

5
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
12.08.2012, 23:57
С выравниванием, да.

Собирайте лучше байты в uint'ы ручками с помощью сдвигов и логического или. А то ещё мало ли в каком порядке они в память пишутся.
1
 Аватар для ZiminAS1990
2 / 2 / 0
Регистрация: 27.07.2012
Сообщений: 31
13.08.2012, 00:03  [ТС]
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
С выравниванием, да.

Собирайте лучше байты в uint'ы ручками с помощью сдвигов и логического или. А то ещё мало ли в каком порядке они в память пишутся.
Вот! Я с одной стороны так и делаю - через сдвиги. А с другой стороны, принимая, структуру накладываю... видать, придёться и с другой стороны ручками получать значения полей.

Спасибо за ответ. Раньше не сталкивался с проблемами выравнивания.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
13.08.2012, 00:28
C++
1
2
3
4
5
6
7
#pragma pack (push)
#pragma pack (2)
struct A {
  uint16_t x;
  uint32_t y;
}
#pragma pack (pop)
и твоя структура будет "плотной" в памяти.
1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
13.08.2012, 00:31
всякими прагмами есть возможность выравнивание отключать. но в этом случае могут возникнуть тормоза или еще какая-нибудь хрень. на разных компиляторах и при сборке под разноразрядные (32 64 рязрадные версии) тоже могут возникруть проблемы. так что выравнивание - штука хитрая. можно попробовать переставить поля местами. в этом случае размер структуры так же может оказаться больше 6 байт, но если на память, занимаемую структурой накатить голые 6 байт, то поля у структуры будут иметь правильныe значения. но как будет в случае 64разрядных машин - хз

вот прагму уже написали. но из-за упаковки могут возникнуть другие более злобные проблемы

вот быстрым поиском нашлась какая-то статейка, в которой что-то написано и есть ссылки на другие похожие темы:
http://www.realcoding.net/arti... nnykh.html
1
 Аватар для ZiminAS1990
2 / 2 / 0
Регистрация: 27.07.2012
Сообщений: 31
13.08.2012, 07:02  [ТС]
Спасибо за ответы, буду иметь ввиду!

Цитата Сообщение от DU Посмотреть сообщение
вот быстрым поиском нашлась какая-то статейка, в которой что-то написано и есть ссылки на другие похожие темы:
http://www.realcoding.net/arti... nnykh.html
И за статейку тоже благодарю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.08.2012, 07:02
Помогаю со студенческими работами здесь

Сортировка структуры по полям
Мне нужно было сделать базу данных контактов и сделать сортировку по фамилиям и номеру телефону. Базу я сделал ,используя шаблон стек. Но...

Сортировка по полям структуры
Необходимо сортировать параграфы по возрастанию. Структура имеет вид: struct gloss { char term; bool flag; int nom; } ...

Доступ к полям структуры
Ребята, подскажите! Почему не получается получить доступ к полям структуры? //Хеш-таблица struct table ...

Доступ к полям структуры по номерам
Как можно присвоить полям структуры номера и организовать к ним доступ по этому номеру? Видел где-то идею сделать внутри структуры функцию,...

Получить доступ к полям структуры
здравствуйте,если свести проблему к локальному контексту, то есть код примерно такой: struct zeus { template<typename...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru