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

Visual C++

Войти
Регистрация
Восстановить пароль
 
 
Paulie
Айхрень...
306 / 174 / 4
Регистрация: 02.06.2009
Сообщений: 1,078
#1

Использование #pragma pack(push,1)... pack(pop) - Visual C++

27.11.2009, 11:58. Просмотров 40603. Ответов 51
Метки нет (Все метки)

Добрый день, товарищи.

Задался вопросом о записи в файл структур данных, читал читал в интернете много интересного. Наткнулся на статью, где описан такой вот вариант задания структур:

C++
1
2
3
#pragma pack (push, 1)
deftype struct {...}
#pragma pack ( pop)
Но почему-то автор не рекомендует использовать, вот я не совсем понял этот момент. Он описал как-то расплывчато пример, когда это не сработает...

Я использую структуру с уже определёнными размерами параметров, так что её размер не будет меняться во времени, проверил, у меня всё работает.

Но почему же автор всё-таки не рекомендует это использовать???
Может есть ещё интересные варианты?

Для записи в файл использую CreateFile, WriteFile (MSDN->System services->File services->file systems->file management)...

Заранее благодарю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2009, 11:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование #pragma pack(push,1)... pack(pop) (Visual C++):

Распаковка parameter pack в наследуемых типах - C++
Есть класс наследуемый от переменного количества типов. Я не могу понять как можно сделать распаковку списка параметров с доступом к...

Обработка parameter pack через функции - C++
Суть - надо напечатать определенный аргумент (допустим третий) с пакета параметров функции. Чего то не соображу как. Вот код:#include...

#pragma - Visual C++
Научите пользоваться этой штуковиной. Интересует для начала что означает само слово pragma для VS и всё что можно сделать через неё.

Pragma comment() - Visual C++
Добрый день! Подскажите, пожалуйста, как быть, если компановщик игнорирует запись #pragma comment(exestr, L"My Programs"). VS 2010 Pro. Мне...

что такое #pragma once? - Visual C++
??????????

[c++, msvc] #pragma suppress warning - C++
Всем привет. Вижал студия 2013. Рассмотрим код: http://rextester.com/FCO39975 //Title of this code //Compiler Version...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
28.11.2009, 18:37 #16
Цитата Сообщение от Evg Посмотреть сообщение
Потому что с ними код программы и его внутренняя архитектура сильно упрощается. Про оптимизации по скорости тут вообще речи не идёт.
ну е-мое... еще раз: ставь выравнивание в 1 байт на всю программу и получишь тот-же результат.
Цитата Сообщение от Evg Посмотреть сообщение
Ещё раз для тех кто в танке. Не "выравнивание структуры", а "выравнивания полей структуры". Ты отличаешь эти понятия?
для тех кто в танке - я говорю о выравнивании структуры данных, а не конкретного объекта с/с++ типа struct. ТЫ отличаешь эти понятия?
Цитата Сообщение от Evg Посмотреть сообщение
Делай. Только при любом изменении во внутренности структуры тебе придётся модифицировать твои процедуры чтения/записи
Да. Если структура в файле отличается от структуры в памяти.
Иначе - я напишу Write(..., &struct xxx, sizeof(xxx)).
что в твоем пример, что нет... ну НЕТ разницы.

только без #pragma жить проще.
Paulie
Айхрень...
306 / 174 / 4
Регистрация: 02.06.2009
Сообщений: 1,078
28.11.2009, 22:29  [ТС] #17
Ребята, Ваши рассуждения очень интересны и полезны, пожалуй. что не только мне, спасибо огромное! Можете, конечно, продолжить

А вот такой вопрос возник по ходу ваших рассуждений, если взять проекцию на Делфи, то диреткива #pragma pack делает что-то наподобие, как и record packed в Делфи? Или второе - это выравнивание структуры, а в сях - выравнивание полей, как сказал уважаемый Evg, ну это так, чисто интерес, вспомнилось былое прошлое...
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
28.11.2009, 22:38 #18
Цитата Сообщение от Patch Посмотреть сообщение
ну е-мое... еще раз: ставь выравнивание в 1 байт на всю программу и получишь тот-же результат
Что такое выравнивание 1 байт на всю программу?

Цитата Сообщение от Patch Посмотреть сообщение
для тех кто в танке - я говорю о выравнивании структуры данных, а не конкретного объекта с/с++ типа struct. ТЫ отличаешь эти понятия?
Что такое выравнивание структуры данных? И вообще, что такое структура данных? При чём тут конкретный объект Си\Си++ (и вообще, где ты этот объект откопал)? Эти понятия я навряд ли отличаю, потому как не втыкаю, про что ты говоришь. И о чём ты там говоришь тоже салабо понимаю, а я говорю конкретно о вопросе, поставленном в данной теме

Цитата Сообщение от Patch Посмотреть сообщение
Да. Если структура в файле отличается от структуры в памяти
Если бы да кабы. Речь идёт о случае, когда отличаются

Цитата Сообщение от Patch Посмотреть сообщение
только без #pragma жить проще
Я в 15-м посте сделал тебе конкретное предложение переписать программу без pragm'ы, на которое кроме невнятного ответа про "выравнивание на всю программу" так ничего и не получил
slowCheetah
11 / 11 / 1
Регистрация: 18.07.2009
Сообщений: 123
11.04.2011, 16:09 #19
знакомый драйверист железячник говорил, что при работе с железками и сетью прям обязательно нужно выравнивать по 1 байту, а сам я раньше по сети слал без выравнивания, а теперь вот наткнулся на топик :-)
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
11.04.2011, 17:30 #20
Цитата Сообщение от __beginner__ Посмотреть сообщение
что при работе с железками и сетью прям обязательно нужно выравнивать по 1 байту
Вообще говоря, любой адрес выровнен на 1 байт. А твои слова сильно смахивают на испорченный телефон. Не говоря уж о том, что напрямую с железками работает только ОС, а не пользовательская программа
xAtom
914 / 739 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.04.2011, 20:40 #21
Почему прикладная программа не работает с железом работает ещё как но использует удобные функции системы а не ввиде 0FEF00E7h абстракцию создаёт понятную нам, парадигма систем облегчение программироавние железа, а не купание в байт кодах. Так же можно сказать про нас что мы с миром не контачим непосредственно а купаемся в абстракциях мозга ЦНС электро-импульсов то что не надо здесь разводить суть вещей...
slowCheetah
11 / 11 / 1
Регистрация: 18.07.2009
Сообщений: 123
11.04.2011, 20:56 #22
Цитата Сообщение от Evg Посмотреть сообщение
Вообще говоря, любой адрес выровнен на 1 байт. А твои слова сильно смахивают на испорченный телефон. Не говоря уж о том, что напрямую с железками работает только ОС, а не пользовательская программа
бла бла бла, какой ты опять умный, опять очередной твой такой же пост

про то, что человек, занимающийся драйверами использует эти приемы в прикладных программах у меня не было и слова - заметь

использует он эти директивы, когда работает с сетью, а драйвера он пишет для сетевых карт, реализует сетевые протоколы на низком уровне и тп и мне советует их использовать в этих же случаях (если когда придется), и что даже в прикладных программах, отправляющих что-то по сети, лучше тоже пользоваться этими директивами

что не пост от Evg, то всегда попытка съязвить

и когда я писал предыдущее собщение, то по-любому был уверен, что найдется хотя бы 1 человек, который несмотря на то, что топику уже 2 года, все равно возьмет и ответит - и о да, конечно же я был уверен на 100 %, что это будет Evg - ведь он обязательно найдет за что зацепится и обязательно покажет свою крутость
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
11.04.2011, 21:58 #23
__beginner__, если отбросить флуд и эмоции, то что ты этим хотел сказать? И заодно поясни, что имелось в виду под "прям обязательно нужно выравнивать по 1 байту", если уж тебе так хочется почесать языком
snake32
1386 / 1029 / 139
Регистрация: 26.02.2009
Сообщений: 3,820
Записей в блоге: 5
05.12.2011, 17:04 #24
Цитата Сообщение от Paulie Посмотреть сообщение
если взять проекцию на Делфи, то диреткива #pragma pack делает что-то наподобие, как и record packed в Делфи? Или второе - это выравнивание структуры, а в сях - выравнивание полей, как сказал уважаемый Evg, ну это так, чисто интерес, вспомнилось былое прошлое...
В делфях record packed выравнивает поля структуры как и #pragma pack 1
Кстати есть ещё выравнивание в массиве packed array
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
28.05.2012, 12:58 #25
коммент не убрал...бывает..
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.05.2012, 20:22 #26
Цитата Сообщение от Evg Посмотреть сообщение
А вопрос не в оптимизации структуры. Вопрос в том, чтобы правильно расписать структуру, чтобы она один в один ложилась на формат бинарного файла. Т.е. если в бинарном файле заголовок состоит из трёх полей размерами в один, четыре и два байта, идущих подряд друг за другом, то можно написать структуру

C
1
2
3
4
5
6
7
8
#pragma pack (push, 1)
struct
{
  char f1;
  int f2;
  short f3;
};
#pragma pack (pop)
и потом целиком экземпляр этой структуры одной операцией записывать или считывать в файл. sizoef от такой структуры будет равен 7. Стандартными средствами языка по-нормальному ты это не сделаешь. Можно только описать структуру, а потом читать-писать каждое поле в отдельности
Недавно столкнулась с такой проблемой: в Линуксе не правильно отображались данные заголовка .bmp рисунка, в виндовс я пользовалась wingdi.h и все работало, и только потом заметила, что структура заключена в данные директивы...
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.05.2012, 20:26 #27
а что внутри структуры? другие структуры, внутри которых - другие и т.д.?

все работает, причем надежно, как бомба. если структуру, которую вы привели, "не заключить в данные директивы", то она будет занимать 10 байт (4+4+2), а если заключить - то 7 (1+4+2). и больше ничего за этим не скрывается. тот, кто хочет позднее обратиться к любому полю кроме f1 не по имени, а по смещению, должен точно знать, как структура была определена: "в директивах" или без.
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
28.05.2012, 20:32 #28
Цитата Сообщение от novi4ok Посмотреть сообщение
а что внутри структуры? другие структуры, внутри которых - другие и т.д.
http://www.cyberforum.ru/blogs/203892/blog441.html
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.05.2012, 20:43 #29
если продолжать, то нужно также уточнить, что означает
в Линуксе не правильно отображались данные заголовка .bmp рисунка
хотя в ссылке вроде УРА написано, так что автор нам просто причину может назвать в деталях.
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
28.05.2012, 20:48 #30
Цитата Сообщение от novi4ok Посмотреть сообщение
так что автор нам просто причину может назвать в деталях
Читатель может самостоятельно ответить на данный вопрос, если немного подумает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2012, 20:48
Привет! Вот еще темы с ответами:

Русские символы NT 4.0+Service pack 6 + Option pack + MS SQL7.0 с СР1251 - C# ASP.NET
Помогите пожалуйста!!!!!! имею NT 4.0+Service pack 6 + Option pack + MS SQL7.0 с СР1251 Выполняю код с подключением к базе через ODBC...

Pack() [function.pack]: Type H: illegal hex digit m in - PHP
Возникла довольно странная проблема, при загрузке страницы вылезает Warning: pack() : Type H: illegal hex digit m in, в чем может быть...

Сделать так чтобы если вводится push выполнялась функция push, если pop то pop - Python
Помогите пожалуйста с данным вопросом: например у меня есть список и несколько возможных с ним операций (например push - добавить элемент...

push и pop - C# ASP.NET
У меня возникла странная проблема. Мы создали сайт на основе системы управления, которой пользовались не один раз. Все сайты нормально...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.05.2012, 20:48
Ответ Создать тему
Опции темы

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