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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 117, средняя оценка - 4.83
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

Что такое __attribute__((packed)),и когда это стоит использовать? - C++

02.12.2009, 03:53. Просмотров 15401. Ответов 1
Метки нет (Все метки)

Читаю чужие исходники,там встречается __attribute__((packed)) и используется в структурах.Я пробовал приписывать это окончание также к классам - компилятор пропускает. Из google понял,что это некий способ выравнивания данных в памяти,когда не занятые биты одной переменной используются для другой переменной. Некоторые пишут,что лучше использовать #pragma pack (в каких случаях?).И ещё много чего пишут,что это как-то связано с кроссплатформенностью,и все эти данные как-то разрознены по сети,кто-нибудь может прояснить этот вопрос,что же такое __attribute__((packed)) ,когда его стоит использовать,а когда нет?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2009, 03:53     Что такое __attribute__((packed)),и когда это стоит использовать?
Посмотрите здесь:
Когда стоит использовать класс, а когда лучше обойтись без них? C++
C++ Тип void как возвращаемое значение функции: что он такое, зачем он нужен, где, когда и как его использовать?
C++ Что такое #, include, что это означает
Что это такое??? C++
C++ Что же это такое ?
C++ Что это такое?
Кто-нибудь может подробно объяснить, что такое allocators, зачем это и что с ними делать? Нигде не нашёл инфы C++
PRINT_ELEMENTS что это такое? C++
Is up to date что это такое? C++
C++ WinMain@16 что это такое?
C++ Что это такое IDE GUI?
C++ cstdarg и stdarg.h - что это такое?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17471 / 5709 / 363
Регистрация: 30.03.2009
Сообщений: 15,677
Записей в блоге: 26
02.12.2009, 11:17     Что такое __attribute__((packed)),и когда это стоит использовать? #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Это атрибут для упакованных структур. Расширение поддерживается только в компиляторе gcc. По этому атрибуту поля в структуру упаковываются без дырок, обучсловленных выравниванием

Где используется - например, см эту тему. Принцип действия тот де самый, только с атрибутом меньше возможности накосячить, в отличие от #pragma pack. Ещё одно отличие - атрибут затрагивает битовые поля, (т.е. упаковывает их вплотную, без учёта стандартной подложки), а #pramga pack - вроде бы как нет

Добавлено через 3 минуты
Цитата Сообщение от #pragma Посмотреть сообщение
Некоторые пишут,что лучше использовать #pragma pack (в каких случаях?)
#pragma pack поддерживается не только компилятором gcc, но и многими другими, т.е. при помощи этой конструкции код получается более переносимым. Но техническая реализация #pragma pack - хреновая. Т.е. если ты собираешь программу компиялтором, который не поддердивает pragm'у, то он её молча проигнорирут (ну или на крайний случай выдаст предупреждение, которое можно и не заметить). В итоге соберётся нерабочая программа. В случае с атрибутом дело обстоит проще - если компилятор атрибут не поддерживает, то он выругается на компиляции (синтаксическая ошибка). По крайней мере сразу будет понятно, что есть такая бяка и что на этом компиляторе программа не соберётся как надо

Добавлено через 2 минуты
Если пишешь программу, которая имееть хоть какой-то шанс быть перенесённой на другой компилятор - лучше вообще отказаться от любого использования работы с упакованными структурами и деалть так, как предлага Patch в вышеуказанной теме. Пусть будет больше кода, но этот код будет перносимым. Хотя в реальной жизни как правило дела обстоят так, что большинство программ под linux пишутся под gcc. Или если программа под винду, то как правило только под один компилятор
Yandex
Объявления
02.12.2009, 11:17     Что такое __attribute__((packed)),и когда это стоит использовать?
Ответ Создать тему
Опции темы

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