Будут ли элементы массива типа uint8_t всегда упаковываться в последовательные байты памяти? - PullRequest
3 голосов
/ 21 октября 2019

У меня есть программа, написанная на C, которая обрабатывает 24-битные аудиосэмплы и упаковывает их в RTP-пакеты для передачи по сети.

Мой код определяет «сэмпл» как объединение int32_tи массив uint8_t [4], чтобы я мог выполнять арифметические операции над целым образцом, а также получать доступ к его отдельным байтам для упаковки в схему кодирования L24, указанную в RFC3190.

Этот подход хорошо работает на обоих ARMи системы на базе Intel, компилируемые с помощью gcc. Тем не менее, я обеспокоен тем, что какой-то другой компилятор или архитектура могут дополнить элементы uint8_t и, следовательно, сломать мою программу. Это действительная проблема? Если да, то есть ли лучший способ обработки аудиоданных?

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

В статически объявленных массивах в C значения хранятся в смежных областях памяти (таким образом, арифметика указателя может использоваться для итерации по значениям). Результатом объединения будет только то, что два члена начинаются в одной и той же ячейке памяти, которая может быть или не быть выровненной. Заполнение может происходить для получения этого выравнивания, но не между элементами / значениями конкретного массива.

Подробнее о дополнении и выравнивании:

  1. http://c -faq.com/struct/padding.html
  2. http://c -faq.com / struct / align.html
1 голос
/ 21 октября 2019

Несмотря на то, что типы [u]intN_t являются необязательными, использовать их безопасно.
См. C11 p7.20.1.1

Имя typedef uintN_t обозначает целочисленный тип без знака с шириной N и без битов заполнения.

Если вы используете реализацию без , то uint8_tвсе равно не скомпилируется.

...