Исправлено выделение std :: vector - PullRequest
4 голосов
/ 08 июля 2019

Я разработчик встроенного программного обеспечения и поэтому не всегда могу использовать все приятные функции C ++.Одна из самых сложных вещей - избегать динамического выделения памяти, так как это несколько универсально для всех контейнеров STL.

std::vector очень полезен при работе с переменными наборами данных.Проблема, однако, в том, что распределение (например, std::reserve) не выполняется при инициализации или фиксировано.Это означает, что фрагментация памяти может происходить при копировании.

Было бы замечательно, чтобы каждый вектор имел выделенную область памяти, которая является максимальным размером, до которого вектор может расти.Это создаст детерминистическое поведение и позволит отобразить использование памяти микроконтроллером во время компиляции.Вызов push_back, когда вектор имеет максимальный размер, может создать std::bad_alloc.

Я прочитал, что можно написать альтернативную версию std::allocator для создания нового поведения выделения.Возможно ли создать такое поведение с помощью std::allocator или альтернативное решение будет более подходящим?

Я действительно хотел бы продолжать использовать библиотеки STL и вносить в них поправки вместо воссоздания собственного вектора.так как я более склонен совершать ошибки, чем их реализация.

sidenote # 1:

Я не могу использовать std::array как 1: это не такпредоставленный моим компилятором и 2: он имеет статическое распределение, но мне все равно придется управлять границей между моими данными и буфером внутри std::array.Это означает переписать std::vector с моими свойствами размещения, от которых я пытаюсь избавиться.

Ответы [ 2 ]

11 голосов
/ 08 июля 2019

Вы можете реализовать или повторно использовать boost static_vector ; Контейнер массива переменного размера с фиксированной емкостью.

1 голос
/ 08 июля 2019

Вы всегда можете использовать массив в стиле C (такой же, как базовый в std::array), поскольку векторы не должны быть статическими

int arr[5]; // static array of 5 integers

Чтобы сделать его более полезным, вы можете обернуть его в шаблон класса, чтобы скрыть стиль C Пример:

template<class type, std::size_t capacaty>
class StaticVector {
    private:
        type arr[capacaty];
        std::size_t m_size;
    public:
        StaticVector() : m_size(0) {}

        type at(std::size_t index) {
            if (index >=0 && index < m_size) {
                return arr[index];
            }

            return type();
        }

        void remove(std::size_t index) {
            if (index >=0 && index < m_size) {
                for (std::size_t i=index; i < m_size-1; i++) {
                    arr[i] = arr[i+1];
                }
                m_size--;
            }
        }

        void push_back(type val) {
            if (m_size < capacaty) {
                arr[m_size] = val;
                m_size++;
            }
        }

        std::size_t size() {
            return m_size;
        }
};

Пример использования: https://onlinegdb.com/BkBgSTlZH

...