LINUX.ORG.RU

История изменений

Исправление 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, полностью оно бы мне не помогло.