История изменений
Исправление vbr, (текущая версия) :
Я не могу его так поменять, там API библиотеки сделано так, что работает с uint8_t и возвращает куски из этого буфера. Я могу этот буфер выровнять через alignas, но указатели проходят через несколько функций, у компилятора нет шансов отследить это выравнивание. Я, конечно, сам знаю, что они выровнены, но для компилятора это uint8_t*.
Сейчас я сделал через __builtin_aligned_as
и код, который просто через битовые сдвиги читает/пишет uint32 в le. Компилятор распознаёт всё это дело и заменяет на одну инструкцию. Хотя это и не стандартный C. Видимо в рамках стандартного C этого никак не сделать. Ну если ту наркоманию с union не учитывать, может оно и работает, но так делать я точно не буду.
Исходная версия vbr, :
Я не могу его так поменять, там API библиотеки сделано так, что работает с uint8_t и возвращает куски из этого буфера. Я могу этот буфер выровнять через alignas, но указатели проходят через несколько функций, у компилятора нет шансов отследить это выравнивание. Я, конечно, сам знаю, что они выровнены, но для компилятора это uint8_t*.
Сейчас я сделал через __builtin_aligned_as
и код, который просто через битовые сдвиги читает/пишет uint32 в le. Компилятор распознаёт всё это дело и заменяет на одну инструкцию. Хотя это и не стандартный C. Видимо в рамках стандартного C этого никак не сделать.
PS ещё я там кодирую/декодирую uint16_t рядом, так что даже если бы там был изначально int buf
, полностью оно бы мне не помогло.