>> Это называется "сериализация-десериализация". Но к сожалению не халявно по ресурсам
> Это если на каждый чих буфера выделять, то не халявно.Это не имеет отношения к выделению буферов. Вот смотри, прямо сейчас у меня есть буфер который я бы хотел рассматривать и как u8[N] и как u32[N/4], тот случай когда раз в год и union мог бы иметь пойнт. Но на самом деле меня вообще вся пачка битов интересовала. Я бы вкатил им union так то, но u32 может быть как big-endian так и little endian, и вот тут я грабелек откушаю оптом и в розницу. И вот именно совершенно халявного (по объему кода и скорости) решения на такие ситуации может и не быть. Даже просто портабельно записать в файл или провод u32 - не, как просто единичная операция это сразу же познакомит нас с Endianess платформы и с тем фактом что она разная бывает.
> А если как с потоком работать, передавая указатели на функции преобразования, то
> можно и без буферов и их копирования обойтись,
Дело не в буферах а в именно "функциях преобразования" так то. Одно дело послать поток как есть. На мк каком - я вообще DMA заряжу, скажу "вгрузи от сих до сих" и забуду об этом, он мне скажет когда готово дернув IRQ а я пока чем-нибудь еще займусь. Это будет просто, круто и быстро. Я просто пульну фоновую операцию, и забуду о ней, потом железка дернет меня IRQ по transfer completion. Но вот с "функциями преобразований" это все уже - сами понимаете, вообще совсем не то. И если на десктопе с кучей ядер и гигагерц иногда катит и так, на мелочи где мегагерцев и памяти мало а поток данных может быть сравним с скоростью проца, потому что не факт что он высокочастотный, да и батарейки жрать не есть хорошо...
> делая всё на лету, в том числе в обработчиках прерываний на микроконтроллерах.
В DMA зарядить так то прикольнее. Почему-то. А обработчик так то только IRQ дернет. Кстати на десктопе в таком стиле тоже можно, если тредов себе завести, IO thread'ы смогут что-то наподобие. Там уже можно интеллект проявить, но опять же преобразования на высокой скорости не бесплатны по ресурсам.
> Потом бывают упакованные данные или значительные объёмы, которые на мелких контроллерах
> просто не влезут ни в какие буфера.
Я иногда балуюсь с DMA half-transfer IRQ: пока железка шлет/получает вон то я в софте жую новый субблок. Параллельно с этим. А что, двойная буферизация это круто.
> Но есть недостаток. Если писать на c++, или на Си, но именно
> gcc, то всё читаемо и хорошо. На на "обычном абстрактном Си"
> будет гадость, а не исходник.
Ну а вот привязываться навечно к 1 компилеру все же - ну так себе. Некрирые вещи из GCC явно стоило бы в стандарт загнать. Особенно case ... switch для диапазона, допустим. Стандартный код выглядит более криво чем с диапазонами в кейсе.