固定分配 std::vector

Fixed allocation std::vector

我是一名嵌入式软件开发人员,因此我不能总是使用所有优秀的 C++ 功能。最困难的事情之一是避免动态内存分配,因为它在某种程度上适用于所有 STL 容器。

然而,std::vector 在处理可变数据集时非常有用。但问题是分配(例如 std::reserve)没有在初始化时完成或固定。这意味着发生复制时可能会出现内存碎片。

如果每个向量都有分配的内存space,这是向量可以增长到的最大大小,那就太好了。这将创建确定性行为,并可以在编译时映射微控制器的内存使用情况。当向量达到最大大小时调用 push_back 将创建 std::bad_alloc.

我读到可以编写 std::allocator 的替代版本来创建新的分配行为。 std::allocator 是否可以创建这种行为,或者替代解决方案是否更合适?

我真的很想继续使用 STL 库并对它们进行修改,而不是重新创建我自己的向量,因为我比它们的实现更容易出错。

旁注#1:

我不能使用 std::array,因为 1:我的编译器不提供它,2:它确实有一个静态分配,但我仍然必须管理我的数据和内部缓冲区之间的边界std::array。这意味着用我的分配属性重写 std::vector,这是我试图摆脱的。

您可以实施或重用 boost 的 static_vector一个variable-size固定容量的数组容器。

您始终可以使用 C-style 数组(与 std::array 中的底层相同),因为向量不应该是静态的

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

为了让它更有用,您可以将其包装在 class 模板中以隐藏 C-style 示例:

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