在DSP应用程序中使用std::vector对象会效率低下吗?

Would using the std::vector object for DSP applications be ineffiecient?

本文关键字:效率 对象 vector 应用程序 std DSP      更新时间:2023-10-16

我目前正在尝试使用c++实现一些DSP算法,我很好奇我是否高效。

我特别想设计一个"DigitalFilter"类,当给定一系列输入时,它将产生一个过滤的输出。现在我面临的问题是过滤器的大小(即过滤器系数的数量)可以变化。因此,DigitalFilter类实例的大小会有所不同。例如,DigitalFilter的一个实例可能只需要保存4个过滤器系数,而另一个实例可能需要保存90个过滤器系数。

保存这些系数的最明显、最简单的方法是使用std::vector对象保存它们。这个对象基本上可以改变大小,这似乎适合我的应用程序。

然而,我也知道这是使用堆分配内存实现的(而不是堆栈内存)。因此,一旦我设置了过滤器并开始使用它进行数学密集型计算,它将不断引用堆数据。我意识到通常与向量相关的开销是,如果向量变得太大而无法容纳其在内存中的原始位置,则需要完全重新分配内存位置,然而,这在我的应用程序中不应该是一个大问题,因为在过滤操作开始之前不会对任何向量进行大小调整。但是,我还是对效率很好奇。

所以我的问题(s):什么样的时间命中将涉及引用堆数据和堆栈数据?处理器的缓存内存是否可能保留这个堆数据以便更快地访问?

在任何标准PC硬件上,堆内存和堆栈内存的访问时间是相同的。

因为你没有在你的过滤算法中调整矢量的大小,你可以在创建矢量时指定它的大小:

std::vector<int> coef(90);

也可以直接使用数组

int * coef = new int[90];

你的观点没有意义。我向你保证,在std::vector中处理DSP数据不仅是完全可能的,而且通常也会这样做-例如,GNU Radio及其高度优化的DSP原语库libVOLK广泛使用向量。

有很多非常奇怪的文献表明堆和堆栈内存的行为不同-这绝对不是在我使用过的任何平台上的情况(到目前为止仅限于x86, x86_64, ARMv7和H8300),你可以安全地忽略这些。

内存就是内存,CPU的内存控制器/缓存控制器将在本地保存最后使用/最频繁使用的内容。只要你的内存模型是顺序的(Bjarne Stroustrup做了一个很好的演讲,主题是"我不知道你的数据结构,但我确信我的向量会踢它的屁股"),如果你访问它,你的CPU缓存将在本地保存它。