Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
ZiminAS1990
 Аватар для ZiminAS1990
2 / 2 / 0
Регистрация: 27.07.2012
Сообщений: 31
12.08.2012, 23:55     Не очевидное смещение к полям структуры #1
Доброе время суток!

Столкнулся с непонятным мне вопросом... у меня есть структура:
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ти байт и заполняю его, а с другой - принимаю этот массив и накладываю на него данную структуру... естественно, что получаю совсем другие числа в полях структуры, чем те, которые ожидаю....

Благодарю за ответы.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
12.08.2012, 23:57     Не очевидное смещение к полям структуры #2
С выравниванием, да.

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

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

Спасибо за ответ. Раньше не сталкивался с проблемами выравнивания.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
13.08.2012, 00:28     Не очевидное смещение к полям структуры #4
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)
и твоя структура будет "плотной" в памяти.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.08.2012, 00:31     Не очевидное смещение к полям структуры #5
всякими прагмами есть возможность выравнивание отключать. но в этом случае могут возникнуть тормоза или еще какая-нибудь хрень. на разных компиляторах и при сборке под разноразрядные (32 64 рязрадные версии) тоже могут возникруть проблемы. так что выравнивание - штука хитрая. можно попробовать переставить поля местами. в этом случае размер структуры так же может оказаться больше 6 байт, но если на память, занимаемую структурой накатить голые 6 байт, то поля у структуры будут иметь правильныe значения. но как будет в случае 64разрядных машин - хз

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

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

Цитата Сообщение от DU Посмотреть сообщение
вот быстрым поиском нашлась какая-то статейка, в которой что-то написано и есть ссылки на другие похожие темы:
http://www.realcoding.net/articles/u...e-dannykh.html
И за статейку тоже благодарю
Yandex
Объявления
13.08.2012, 07:02     Не очевидное смещение к полям структуры
Ответ Создать тему
Опции темы

Текущее время: 13:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru