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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ZiminAS1990
2 / 2 / 0
Регистрация: 27.07.2012
Сообщений: 31
#1

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

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

Благодарю за ответы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2012, 23:55     Не очевидное смещение к полям структуры
Посмотрите здесь:

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

В цикле пройти по полям структуры - C++
Доброго времени суток! Имеется структура данных struct Rules { public: std::string left; std::string...

Присвоить значения полям структуры - C++
Фрагмент программы. не могу присвоить значения полям структуры.почему??? ошибка Lvalue required class laba { int...

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

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

Как присвоить полям структуры значение? - C++
Добрый день! У меня есть некая структура, как присвоить ей значение и передать в функцию. Если не трудно, можно на примере: { char...

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

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

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

Спасибо за ответ. Раньше не сталкивался с проблемами выравнивания.
novi4ok
551 / 504 / 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
1482 / 1058 / 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 07:02     Не очевидное смещение к полям структуры
Еще ссылки по теме:

Ошибка при доступе к полям структуры - C++
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int error C2679: binary '=' : no operator found...

Присвоить значение полям динамического массива структуры - C++
Здравствуйте, у меня возник такой вопрос: А как можно присвоить значение полям динамиского масива структуры... у меня не получилось,...

Смещение в массиве данных - C++
Я просмотрел все примеры в операции с массивами,но такого не нашёл. Мне приходит массив например 1222,и мне надо сделать преобразование,...

Смещение в файле более 4 Gb - C++
Всем привет. Есть необходимость хранить смещение на данные в файле(памяти), который более 4 Gb. Задача тривиальна. Нужно использовать...


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

Или воспользуйтесь поиском по форуму:
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     Не очевидное смещение к полям структуры
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru