在DSP应用程序中使用std::vector对象会效率低下吗?
Would using the std::vector object for DSP applications be ineffiecient?
我目前正在尝试使用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缓存将在本地保存它。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- 将大型对象存储在无序映射中是否效率低下
- 成员功能在面向对象的框架中返回std :: vector.size()的效率
- 构造函数效率低下,适用于按值从函数返回对象的情况
- 删除函数中的对象:丑陋、容易出错、效率低下,而且通常不安全
- 避免在C++循环中循环中复杂对象时最小化范围效率低下的技术
- 在DSP应用程序中使用std::vector对象会效率低下吗?
- 使用大对象时的STL效率
- c++中的临时对象如何影响效率