gpt4 book ai didi

c++ - 预分配内存列表

转载 作者:行者123 更新时间:2023-11-28 06:35:04 27 4
gpt4 key购买 nike

我们尝试开发一个实时应用程序。在这个程序中,4 个摄像头每秒向一个方法发送 100 次图像阵列。在这种方法中,我必须复制每个数组。 (用于其他线程中的ImageProcessing)。

我想将每个相机的最后 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 那么您可以“处理” vector 中该索引处的图像,然后递增变量直到它捕获从 next 开始。

关于c++ - 预分配内存列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26904788/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com