GCC's __ приписывают __ ((__ упакованный __)), сохраняют исходное упорядочивание?

Если Вам нравится использовать управление сервером, которое делает большую работу для Вас, то Вам НЕ понравится MVC, потому что необходимо будет сделать большое кодирование руки в MVC. Если Вы любите GridView, ожидаете писать тот сами или использовать чужой.

MVC не для всех, особенно если Вы не в поблочное тестирование часть GUI. Если Вы довольны веб-формами, остаетесь с ним. Веб-формы 4.0 зафиксируют некоторые текущие недостатки как идентификатор, которые автоматически присвоены ASP.NET. Вы будете иметь контроль над ними в следующей версии.

25
задан Mawg 20 July 2016 в 09:55
поделиться

4 ответа

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

Раздел §6.7.2.1p13:

В пределах объект структуры, небитовое поле члены и подразделения, в которых битовые поля имеют адреса, которые увеличиваются в том порядке, в котором они объявлены.

, а в документации для атрибута "упаковано" четко указано, что это влияет только на заполнение / выравнивание:

Атрибут "упакованный" указывает, что поле переменной или структуры должно иметь как можно меньший выравнивание - один байт для переменной, и один бит для поля, если вы укажите большее значение с помощью выровненный атрибут.

27
ответ дан 28 November 2019 в 18:01
поделиться

Да.

Однако использование __ attribute __ ((__ pack __)) не является хорошим способом делайте то, что делаете.

  • Это не решает проблемы с порядком байтов
  • Доступ к структуре будет медленным
  • Хотя популярность gcc привела к ситуации, когда другие компиляторы часто реализуют расширения gcc, используя это Расширение для конкретного компилятора означает, что у вас нет соответствующей программы на C. Это означает, что если другой компилятор или даже будущий gcc изменит упакованный или не реализует его вообще, вам не повезло, и вы даже не сможете никому пожаловаться. Gcc может отказаться от него завтра и по-прежнему оставаться компилятором C99. (Хорошо, это маловероятно. ) Большинство из нас пытается писать соответствующие программы не потому, что у нас есть некоторая абстрактная враждебность к использованию программного обеспечения поставщика или желаем некоего академического стандарта чистоты кода, а потому, что мы знаем, что только соответствующие языковые функции имеют точную и общую спецификацию, так что это далеко Намного легче полагаться на то, что наш код изо дня в день делает правильные вещи и система к системе, если мы будем делать это таким образом.
  • Вы изобретаете колесо; эта проблема уже решена в соответствии со стандартами: см. YAML , XML , и JSON .
  • Если это так мало -уровневый протокол, в котором недоступны YAML, XML и JSON, вам действительно следует взять отдельные базовые типы, применить версию hton? () и ntoh? () вашего хоста и memcpy () их к выходному буферу. Я понимаю, что существует давняя традиция чтения и записи прямо из структур, но я также потратил много времени на исправление этого кода позже, когда он был перемещен из 32-битной в 64-битную среду ...
3
ответ дан 28 November 2019 в 18:01
поделиться

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

struct foo
{
  short someField : 16 __attribute__ ((packed));
};

Это гарантирует, что someField будет храниться как 16 бит и не будет переупорядочен или изменен для соответствия границам байтов.

2
ответ дан 28 November 2019 в 18:01
поделиться

Да, у C есть гарантия, что элементы структуры не будут переупорядочены. (Могут существовать расширения или необычные системы оптимизации, которые могут это изменить, но не по умолчанию в gcc.)

1
ответ дан 28 November 2019 в 18:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: