|
Айхрень...
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
|
||||||
Использование #pragma pack(push,1)... pack(pop)27.11.2009, 11:58. Показов 90134. Ответов 51
Метки нет (Все метки)
Добрый день, товарищи.
Задался вопросом о записи в файл структур данных, читал читал в интернете много интересного. Наткнулся на статью, где описан такой вот вариант задания структур:
Я использую структуру с уже определёнными размерами параметров, так что её размер не будет меняться во времени, проверил, у меня всё работает. Но почему же автор всё-таки не рекомендует это использовать??? Может есть ещё интересные варианты? Для записи в файл использую CreateFile, WriteFile (MSDN->System services->File services->file systems->file management)... Заранее благодарю.
0
|
||||||
| 27.11.2009, 11:58 | |
|
Ответы с готовыми решениями:
51
IAR EWARM, непонятное поведение data pragma pack Русские символы NT 4.0+Service pack 6 + Option pack + MS SQL7.0 с СР1251 |
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
|
| 28.11.2009, 08:12 | |
Сообщение было отмечено как решение
Решение
почему автор не рекомендует:
http://www.kalinin.ru/programm... 7_00.shtml если совсем коротко, то это директивы выравнивания данных. и если их более одной в проекте, возможны накладки, когда одна и та-же структура данных будет иметь разное представление в памяти. не надо извращаться. гарантированно работает только то, что сделаешь сам. без всяких "супердеректив".
4
|
|
|
Айхрень...
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
|
|
| 28.11.2009, 13:54 [ТС] | |
|
Получается, что единственно реальным и надёжным остаётся способ записи в файл структур - это запись отдельно каждого элемента структуры? Хм...
0
|
|
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
|
| 28.11.2009, 14:04 | |
|
да.
для каждой сохраняемой структуры/класса лучше делаю собственные функции сохранения/восстановления. причем, если программу планируется когда либо переносить на другой компилятор(например, VS 2008 вместо VS 6), то очень желательно еще и принудительно ограничивать размеры переменных. потому, что размер int, например, может варьироваться от 16 до 64 бит, в зависимости от компилятора и его настроек. и одна и та-же программа, скомпилированная в разных компиляторах, создаст тебе файлы разного размера.
3
|
|
|
|
|
| 28.11.2009, 14:21 | |
Сообщение было отмечено как решение
Решение
> и если их более одной в проекте, возможны накладки, когда одна и та-же структура данных будет иметь разное представление в памяти.
Ерунда всё это. Для того и сделаны директивы push и pop, чтобы работали вложенные случаи. Если эти директивы лепить непосредственно до и после описания одной структуры, то всё будет нормально. Если начать извращаться типа push написать в одном месте файла, дальше идёт описание 30 структур, между которым ещё торчит какой-то #include - то да, есть все шансы для того, чтобы в разных файлах описание одной и той же структуры подцепилось в разной форме. Работа с данными директивами концептуально ничем не отличается от работы с указателями: в умелых руках это мощный инструмент, а в кривых руках очередной способ развалить работу программы Добавлено через 56 секунд Если я непонятно выразился про "между которым ещё торчит какой-то #include" - могу для наглядности пример сделать
12
|
|
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
||
| 28.11.2009, 14:27 | ||
|
просто не знаю ни одного примера, где применение #pragma pack давало бы сколько-то значимый результат. если уж оптимизировать структуры и работу программы - то лучше всю целиком, через опции компилятора. ИМХО.
2
|
||
|
|
||||||
| 28.11.2009, 14:34 | ||||||
Сообщение было отмечено как решение
Решение
А вопрос не в оптимизации структуры. Вопрос в том, чтобы правильно расписать структуру, чтобы она один в один ложилась на формат бинарного файла. Т.е. если в бинарном файле заголовок состоит из трёх полей размерами в один, четыре и два байта, идущих подряд друг за другом, то можно написать структуру
9
|
||||||
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
||
| 28.11.2009, 15:17 | ||
|
но помнится мне, делал я как-то программку анализа звука. считывал и разбирал wav-файлы. читал просто кусок файла в буфер, определял указатель на структуру, идентичную структуре файла, и приравнивал ее к указателю на буфер. и работал со структурой через указатель прямо в буфере. и записывал обратно так-же. накладок не было. но это без #pragma pack, естественно.
1
|
||
|
|
|
| 28.11.2009, 15:28 | |
|
В твоём случае структуру можно было определить нормально, т.к. она без "дырок", обусловленных выравниванием. В указанной выше структуре в стандартном случае будут дырки, а потому без упакованных структур тут ничего не сделаешь (имеется в виду по простому)
2
|
|
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
||
| 28.11.2009, 15:39 | ||
|
VS 6. работает. выравнивание - 1 байт. без #pragma pack. ![]() ... в общем вывод - все от рук зависит.
1
|
||
|
|
|||||||||||||||||||||
| 28.11.2009, 15:55 | |||||||||||||||||||||
Сообщение было отмечено как решение
Решение
> выравнивание - 1 байт.
Стесняюсь спросить, и каким это образом ты проверил? Добавлено через 2 минуты И, собственно, не совсем понятно, при чём тут вообще выравнивание структуры, когда мы говорим о распределении полей в структуре?
Или, что более ближе к данной теме, вот такой пример:
6
|
|||||||||||||||||||||
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
||
| 28.11.2009, 15:58 | ||
![]() Я вообще перестаю понимать, о чем ты тогда пишешь. а метод проверки - стандартный: сделал файл, записал, считал, дебаггером посмотрел процесс. хотя, наверно, и по-другому можно... ладно, не важно. лучше прочитай статью по ссылке из поста #2.
1
|
||
|
|
||||
| 28.11.2009, 16:22 | ||||
Сообщение было отмечено как решение
РешениеДобавлено через 2 минуты Кстати, разработчики gcc сделали более правильный вариант - атрибут структуры __attribute__((packed (<value>))), с которым нет такой возможности накосячить, как с pragm'ой. При этом поддержали вариант pragma pack push/pop
5
|
||||
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
|
| 28.11.2009, 16:45 | |
|
хм... да не о том речь...
я знаю в чем отличие. 1)см. первый авторский пост - речь шла о работе с файлами. 2)мне не хватает фантазии представить программу, у которой часть структур будет выровнена на 1 байт, а часть - на 2/4, так, чтобы это значимо сказывалось на скорости исполнения. ну, если ты пишешь программу, работающую быстро - оптимизируй на скорость и выравнивай на 2/4; если мало места - оптимизируй на экономичность и выравнивай на 1 байт; на кой фиг нужна директива, меняющая выравнивание отдельно взятой структуры - ума не приложу. единственный вариант, который приходит в голову - это База данных, но... там ПРИХОДИТСЯ выравнивать структуры в файле на 1 байт, иначе диска не хватит. а чтобы еще и в памяти доступ быстро шел приходится писать СОБСТВЕННЫЕ функции считывания/записи, т.к. в этом случае данные в памяти и в файле хранятся в немного разных форматах. вот и получается... нафиг эта директива не нужна, а для сохранения/восстановления структур лучше делать собственные функции.
1
|
|
|
|
||||||||||||
| 28.11.2009, 18:04 | ||||||||||||
Сообщение было отмечено как решение
Решение
Добавлено через 53 секунды > на кой фиг нужна директива, меняющая выравнивание отдельно взятой структуры - ума не приложу Ещё раз для тех кто в танке. Не "выравнивание структуры", а "выравнивания полей структуры". Ты отличаешь эти понятия? Добавлено через 2 минуты > нафиг эта директива не нужна, а для сохранения/восстановления структур лучше делать собственные функции. Делай. Только при любом изменении во внутренности структуры тебе придётся модифицировать твои процедуры чтения/записи
3
|
||||||||||||
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
||||
| 28.11.2009, 18:37 | ||||
|
Иначе - я напишу Write(..., &struct xxx, sizeof(xxx)). что в твоем пример, что нет... ну НЕТ разницы. только без #pragma жить проще.
1
|
||||
|
Айхрень...
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
|
|
| 28.11.2009, 22:29 [ТС] | |
|
Ребята, Ваши рассуждения очень интересны и полезны, пожалуй. что не только мне, спасибо огромное!
Можете, конечно, продолжить ![]() А вот такой вопрос возник по ходу ваших рассуждений, если взять проекцию на Делфи, то диреткива #pragma pack делает что-то наподобие, как и record packed в Делфи? Или второе - это выравнивание структуры, а в сях - выравнивание полей, как сказал уважаемый Evg, ну это так, чисто интерес, вспомнилось былое прошлое...
1
|
|
|
|
|||||
| 28.11.2009, 22:38 | |||||
|
2
|
|||||
|
11 / 11 / 2
Регистрация: 18.07.2009
Сообщений: 123
|
|
| 11.04.2011, 16:09 | |
|
знакомый драйверист железячник говорил, что при работе с железками и сетью прям обязательно нужно выравнивать по 1 байту, а сам я раньше по сети слал без выравнивания, а теперь вот наткнулся на топик :-)
0
|
|
|
|
||
| 11.04.2011, 17:30 | ||
|
1
|
||
| 11.04.2011, 17:30 | |
|
Помогаю со студенческими работами здесь
20
Pack() [function.pack]: Type H: illegal hex digit m in Сделать так чтобы если вводится push выполнялась функция push, если pop то pop Push, Pop push и pop Функции pop и push Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|