Я новичок во встроенных функциях NEON, и я хотел работать с uint8x16_t
, а также uint8x16x4_t
. Работая с ним, я столкнулся с ситуацией, когда я хотел извлечь байт из uint8x16_t
. Будучи наивным в деталях, я случайно начал извлекать из него байты с помощью оператора []
во время выполнения. Но мой компилятор CLANG успешно скомпилировал код, не выдал никаких ошибок или предупреждений, и я получил желаемый результат.
Я просмотрел справочные руководства ARM и, похоже, никогда не нашел ссылки на использование оператора []
вектор uint8x16_t
, ведь это 128-битный регистр, а не массив !? (Пожалуйста, поправьте меня, если я ошибаюсь).
Поэтому, чтобы пролить свет на проблему, я отследил происхождение вектора uint8x16_t
в файле заголовка arm_neon.h
и нашел следующее:
typedef __attribute__((neon_vector_type(16))) uint8_t uint8x16_t;
Как это хранится в памяти компьютера?
Почему я могу использовать оператор []
непосредственно на нем, где я должен использовать:
uint8_t выборка (uint8x16_t * r, int index) {unsigned char u [16]; vst1q_u8 (и, * г); return u [индекс]; }
вместо:
uint8_t fetch (uint8x16_t * r, int index) {return (* r) [index]; } // Это намного быстрее по производительности!
Мы будем благодарны за любую помощь!