12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
|
|||||||||||
1 | |||||||||||
Что с размером структуры?25.08.2018, 01:30. Показов 719. Ответов 10
Метки нет (Все метки)
Есть структура, которая по моим несложным расчётам, должна занимать 14 байт:
Немного наговнокодив, я выяснил, что после char Type[2]; вставляются ещё 2 лишних нулевых байта... Почему?
Вывод
16
0: 66: B 1: 77: M 2: 0: 3: 0: 4: 99: c 5: -85: « 6: 118: v 7: 0: 8: -46: Т 9: 4: ╝ 10: 51: 3 11: 25: 12: 24: 13: 86: V 14: 1: ╔ 15: 0: 0: 66 77: BM 2: 0 << Вот тут лишние 2 байта! 4: 7777123 8: 1234 10: 6451 12: 87576
0
|
25.08.2018, 01:30 | |
Ответы с готовыми решениями:
10
Из массива Х размером nx, сформировать массив Y размером ny, что бы элементы из массива X не повторялись в Y Динамические структуры данных, списковые структуры (надо разобраться что делает программа) Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла? Оптимизация кода, структуры базы, или что еще можно сделать что бы быстрее работало!? |
25.08.2018, 01:31 | 2 |
1
|
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
|
||||||
25.08.2018, 09:37 | 5 | |||||
Скорее всего, дело именно в выравнивании.
Если посмотреть на данную структуру в заголовках виндовс, то можно увидеть примерно такое:
1
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|||||||||||||||||||||
25.08.2018, 10:21 | 6 | ||||||||||||||||||||
Что-то мне подсказывает, что содержимое pshpack2.h выглядит как-то так
1
|
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
|
|||||||||||
25.08.2018, 11:25 | 7 | ||||||||||
pshpack2.h
poppack.h
Как я понимаю, у microsoft структуры выравниваются в зависимости от опции компилятору "/Zp". По умолчанию для 32х битных приложений 4, для 64х битных 8. Эта опция задаётся и переопределяется настройками проекта --> настройками файла --> pragma pack. Данное выравнивание применяется дефолтно при отсутствии в объявлениях структур явно указанных модификаторов __declspec(align(...)). Если модификаторы присутствуют, то они приоритетней. Ну и формат pragma pack менялся со временем, сперва в синтаксисе не было предусмотрено push и pop, были только установка нового и возврат к дефолтному.
1
|
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
|
||||||
25.08.2018, 12:26 [ТС] | 9 | |||||
В общем, дело действительно оказалось в выравнивании, и вот так всё заработало как надо:
Kuzia domovenok, спасибо за статью... А то если бы сам начал разбираться, то, скорее всего, тупо бы подумал, что выравнивание происходит просто по границе в 4 байта, сомневаюсь, что я бы это с типом самого поля связал... Да и к тому-же, там я про битовые поля узнал. Крутая штука, оказывается... Ygg, о, так bitmapheader где-то в стандартных заголовках есть... Но я всё равно лучше свою структуру использовать буду, а то ещё искать, где он там... COKPOWEHEU, , так, тут что-то посложнее пошло... вместо push и 1 в одних скобках они тут отдельными pgarma'ми, да ещё и __attribute__((__packed__))S какой-то... Ну да ладно, пойду, тогда, по подробнее про эти pragma pack где-нибудь почитаю...
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
25.08.2018, 15:52 | 10 |
Их можно объединить, но можно писать и по отдельности.
А вот это, в отличие от прагмы, указание компилятору. Теоретически, одного этого атрибута должно быть достаточно для максимальной упаковки. Но разработчики компиляторов считают иначе. Это правильный подход. Хорошо бы где-то в коде вкрутить специальную проверку поддерживается ли такая прагма. Впрочем, компиляторы должны и сами говорить "я такой прагмы не знаю".
1
|
26.08.2018, 12:14 | 11 |
https://tproger.ru/translation... e-packing/ Очень неплохо написано про выравнивание, с примерами
0
|
26.08.2018, 12:14 | |
26.08.2018, 12:14 | |
Помогаю со студенческими работами здесь
11
Можно ли коробку размером a b c упаковать в посылку размером r s t? «Углом» укладывать нельзя Из заданного одномерного массива A размером N получить квадратную матрицу B размером M х M Просуммировать элементы матрицы строк размером 4*3. Результат получить в одномерном массиве размером 4 Из заданной матрицы A размером N*M получить матрицу В размером K*3 по правилу: первый столбец состоит из полож Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |