Prelloc内存列表

Prealloc memory list

本文关键字:列表 内存 Prelloc      更新时间:2023-10-16

我们试图开发一个实时应用程序。在这个程序中,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