【发布时间】:2010-05-12 13:12:59
【问题描述】:
我有一个函数,它获取一个 n 字节的输入缓冲区,并且需要一个 n 字节的辅助缓冲区来处理给定的输入缓冲区。
(我知道向量在运行时分配内存,假设我正在使用一个使用静态预分配内存的向量。想象一下,这不是一个 STL 向量。)
通常的做法是
void processData(vector<T> &vec) {
vector<T> &aux = new vector<T>(vec.size()); //dynamically allocate memory
// process data
}
//usage:
processData(v)
由于我在实时环境中工作,我希望提前预分配我需要的所有内存。
缓冲区仅在启动时分配一次。我希望每当我分配一个向量时,我会自动为我的processData 函数分配辅助缓冲区。
我可以用模板函数做类似的事情
static void _processData(vector<T> &vec,vector<T> &aux) {
// process data
}
template<size_t sz>
void processData(vector<T> &vec) {
static aux_buffer[sz];
vector aux(vec.size(),aux_buffer); // use aux_buffer for the vector
_processData(vec,aux);
}
// usage:
processData<V_MAX_SIZE>(v);
但是,使用模板进行大量工作并不是很有趣(现在让我们重新编译所有内容,因为我更改了评论!),并且每当我使用此功能时,它都会迫使我做一些簿记。
有没有更好的设计解决这个问题?
【问题讨论】:
-
强制性问题:您是否分析过您的代码以证明动态内存分配确实存在问题?我知道每个人都说您应该预先为实时内容分配所有内容,但这实际上取决于您的系统。
-
根据需求,我过去所做的是动态分配一个预先确定的大小。然后将所需的大小与已分配的大小进行比较,如果没有足够的空间就重新分配。这将确保您始终有足够的空间,并且分配最终会停止,从而稳定系统。
-
@Kristo:“实时”意味着如果处理时间超过指定时间,则会出现错误。分析只能显示分析运行期间发生的最坏情况,而不是理论上的最坏情况。动态分配只有在分配器能够保证其所花费时间的上限时才是安全的。
-
@Mike,我称之为“硬实时”。我目前以编写“软实时”代码(即,一些破坏的帧不是问题)为生。我们在各处动态分配内存,这不是问题。我们的硬件足够强大,可以满足我们的需要。我只是想清除 OP 方面不必要的过早优化。
-
@Kristo,首先,公司的政策是不使用动态分配。但即使不是,在关键任务代码中,我也需要向 mgmt 验证我的代码是否正确。如何通过动态分配做到这一点?我如何验证没有碎片会破坏事物?我认为编写没有动态分配的代码比验证我的动态分配是否正常工作更容易。
标签: c++ memory-management real-time