[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3706912#p3706912"]передается указатель на структуру, а не структура, как я и писал.[/uquote]
Это вроде и так было понятно...
А что толку от шаблонного класса, если для экономии памяти кольцевой буфер все равно выделяется статически, а часто вообще вырождатся в что-то типа:
C++ буфер проще в обращении, не так захламляет глобальное пространство имен, для него доступны дополнительные оптимизации и т.д.... Например, есть у нас два буферизированных USART, тогда можно написать:
Код: Выделить всё
Usart1<16, 32> usart1;
Usart2<10, 20> usart2;
И внутри каждого будет создано по два кольцевых буфера заданных размеров, причем для первого USART они будут оптимизированы под POT, а для второго автоматически на этапе компиляции будет выбран более общий алгоритм. Формально там есть проверки, но так как это компайл-тайм проверки, но в коде их не будет даже при выключеной оптимизации. Кстати, если ее таки выключить, а это нужно для нормальной отладки, то компилятор поубирает практически весь инлайнинг, а ведь у С++ методов нет этого лишнего параметра в виде указателя на структуру, так что сишный код по размеру может быть даже больше. Дополнительно можно и индексы по размеру соптимизировать, на ARM я так не делаю, потому что там команды заточены под 32 бита, а RAM много, но если это какие-нибудь AVR, то так вполне можно сделать. Для связанного списка, где индексы могут значительно увеличивать потребление RAM, у меня так и сделано:
Код: Выделить всё
template<typename T, uint32_t capacity>
class List
{
using TI = std::conditional_t<(capacity > 254), uint16_t, uint8_t>;
struct Node
{
T value;
TI prev, next;
};
Node buf[capacity + 1];
......
Тут в зависимости от размера prev и next будут uint8_t или uint16_t. Да и в целом, как на С задать размеры 4-х буферов настолько простым способом?
Странно. Или Вы не умеете писать на C, или C++ научился обходиться вообще без инициализации своей среды. Иначе расход RAM должен был быть большим.
Но даже в этом случае - почти 10% памяти коту под хвост - непозволительная роскошь. У PDK14 - 128 байт RAM
Разница в 10 байт флеша, практически все мои шаблонные классы не имеют полей вообще и RAM не потребляют, по крайней мере если говорить о классах периферии.
Кстати, а чем Вы его заменяете, если не секрет?
Ничем, если нужно мало ног, ставлю 20-ти ногий STM32F0. Сейчас появились G0, там есть 8-ми пиновые, плюс они малопотребляющие, начнут продавать по адекватным ценам, буду ставить их. Я не создаю устройства которые продаются крупными партиями или просто продаются, потому дешевые падауки мне без надобности, с другой стороны у эмбеддеров обычно нет такого опыта использования С++ какой есть у программистов с ПК
