Prelloc内存列表
Prealloc memory list
我们试图开发一个实时应用程序。在这个程序中,4台摄像机每秒发送100次图像阵列到一个方法。在这种方法中,我必须复制每个数组。(用于其他线程中的图像处理)。
我想把每台相机的最后100张图像存储在一个列表中。
问题是:如何在列表中预先分配这样的内存(在构造函数中新建它们?)。
我想使用一个固定大小的环形缓冲区,分配内存数组和fifo主体。
知道怎么做吗?
第1版:伪代码示例:
// called from writer thread
void receiveImage(const char *data, int length)
{
Image *image = images.nextStorage();
std::copy(data, data + length, image->data);
}
// prealloc
void preallocImages()
{
for (int i = 0; i < 100; i++)
images.preAlloc(new Image(400, 400));
}
// consumer thread
void imageProcessing()
{
Image image = image.WaitAndGetImage();
// ... todo
}
假设您创建了一个Image
类来保存图像的数据,其环形缓冲区相当于:
std::vector<Image> images(100);
int next = 0;
...
while (whatever)
{
images[next++] = get_image();
next %= images.size();
}
您谈到了预分配内存:每个Image
构造函数都可以拥有为自己的映像预分配内存的任务。如果可以用new
做到这一点,或者如果你有不是特别大的固定大小的图像,你可以在Image
类中尝试一个相应大小的数组。。。这样,所有图像数据都将连续地保存在内存中——"按顺序"迭代图像可能会更快一些。请注意,仅仅分配了虚拟地址并不意味着还没有物理备份内存,而且这些东西仍然可以交换到虚拟内存中。如果您有内存访问速度问题,您可能需要考虑在使用之前扫描内存以查找您希望使用的图像,或者使用操作系统功能向操作系统建议您想要的内存使用模式。不妨先做点工作,然后对其进行分析;-)。
对于FIFO处理,只需让另一个变量也从0开始,如果它是!= next
,那么你可以"处理"向量中该索引处的图像,然后递增变量,直到它赶上next
。
相关文章:
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- CertGetCertificateChain 具有支持的内存存储和证书信任列表
- Shared_ptr双链接列表内存泄漏
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- C 中的学生指针节点列表中的内存泄漏
- 我可以在 Boost.Spirit.Qi 中向列表运算符 (%) 提供内存分配提示吗?
- 使用初始值设定项列表的初始化类成员会导致内存泄漏
- 声明变量以保存字符串列表时的内存分配
- 如何在不泄漏内存的情况下删除链接列表
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 将节点添加到链接列表中,而无需明确分配内存空间(无需使用新)
- 这会导致使用链接列表的内存泄漏
- 链接列表C 的复制构造函数中的内存泄漏
- 存在内存泄漏问题的链接列表
- 使用动态内存从向前列表中泄漏
- 双链接结构列表的内存泄漏
- 布尔内存有效链接列表
- 在声明节点创建链接列表时,为什么静态内存分配不起作用
- C 链接列表内存错误