固定分配 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;
}
};
我是一名嵌入式软件开发人员,因此我不能总是使用所有优秀的 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;
}
};