Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

12.08.2012, 23:55. Просмотров 560. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2012, 23:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не очевидное смещение к полям структуры (C++):

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

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

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

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

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

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

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

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

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

Спасибо за ответ. Раньше не сталкивался с проблемами выравнивания.
0
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)
и твоя структура будет "плотной" в памяти.
1
DU
1484 / 1130 / 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
1
ZiminAS1990
2 / 2 / 0
Регистрация: 27.07.2012
Сообщений: 31
13.08.2012, 07:02  [ТС] #6
Спасибо за ответы, буду иметь ввиду!

Цитата Сообщение от DU Посмотреть сообщение
вот быстрым поиском нашлась какая-то статейка, в которой что-то написано и есть ссылки на другие похожие темы:
http://www.realcoding.net/articles/u...e-dannykh.html
И за статейку тоже благодарю
0
13.08.2012, 07:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 07:02
Привет! Вот еще темы с ответами:

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

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

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

Sort vector, сортировка по двум полям структуры - C++
Поскажите как отсортировать если: struct DATA{ string fir; string sec; double sm; }; vector <DATA> vec; vector...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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