Шаблон C ++ Design, чтобы избежать шаблонов для массивов фиксированного размера - PullRequest
1 голос
/ 07 июня 2019

В системе, где динамическое выделение памяти не разрешено (т.е. не используется std :: vector и т. Д.), Каков хороший способ создать буферный класс фиксированного размера без использования шаблонов?

A заметилимой размер исполняемого файла начинает ползти из-за повторной генерации кода.

В настоящее время у меня есть шаблон, похожий на этот, обратите внимание, что Fifo не обязательно фактическое приложение, просто упрощенный пример.

template <int S>
class FixedSizeFifo
{
    private:
       std::array<uint8_t, S> mBuf;
    public:
       PushFunction() {...}
       PopFunction() {...}
};
FixedSizeFifo<1000> myTransmitFifo;
FixedSizeFifo<100> myReceiveFifo;

Мое первое очевидное решение состояло в том, чтобы сначала выделить хранилище, а затем передать указатель и размер в класс Fifo, но это обеспечивает больший код инициализации и управление указателями и т. Д.

class FixedSizeFifo
{
    private:
       uint8_t * mBuf;
       size_t mBufSize;
    public:
       FixedSizeFifo() = delete; // And other copy constructors/operators
       FixedSizeFifo(uint8_t * buf, size_t s) : mBuf(buf), mBufSize(s) {}
       PushFunction() {...}
       PopFunction() {...}
};
std::array<uint8_t, 1000> txBuf;
auto myTransmitFifo = FixedSizeFifo(txBuf.data(), txBuf.size());
std::array<uint8_t, 100> rxBuf;
auto myReceiveFifo = FixedSizeFifo(rxBuf.data(), rxBuf.size());

Какие другие интересные методыдля приложений хранения фиксированного размера, как это?

Спасибо ...

1 Ответ

0 голосов
/ 10 июня 2019

Существует три распространенных решения этой проблемы. У всех есть свои плюсы и минусы:

1 - Шаблон класса / функции, которую вы передаете (как в первом примере выше). Это может привести к риску раздувания кода в зависимости от количества созданных экземпляров шаблона и сложности класса шаблона. Хотя делает для чистого и простого вида кода.

2 - Передать указатель и размер (как во втором примере выше) - Полностью избегает шаблонов, но добавляет риск управления указателями, но обычно их можно легко уменьшить. Потенциально совместим с кодом C.

3 - Используйте шаблон проектирования, аналогичный std :: string_view (или etl :: array_view во встроенной библиотеке шаблонов) или std :: span. По сути, оберните указатель на выделенную память и ее размер в другом объекте и передайте его. Имеет преимущества, заключающиеся в возможности вызова общих функций для переданной оболочки. Однако теперь у вас есть третий шаг в коде вызова; создайте память, создайте обертку в памяти, вызовите функцию с оберткой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...