使用指向结构的指针数组,或仅使用结构数组?

时间:2011-06-30 21:36:57

标签: c data-structures signal-processing

我正在C中为微控制器开发FFT算法,并且无法决定是否将输入数据的实部和虚部存储在结构数组中,或者使用指向结构数组的指针。我面临着相互矛盾的要求,即代码必须在少量内存中运行,并且尽可能快。我相信结构的指针数组会有更大的内存开销,但我的代码中有一行基本上如下所示:

for (uint8_t i = 0; i < RECORD_SIZE; i++)
{
    uint8_t decimateValue = fft_decimate(i);
    fftData[i]->realPart = fftTempData[decimateValue]->realPart;
    fftData[i]->imPart = fftTempData[decimateValue]->imPart;
}

我想如果我使用一个指向结构的指针数组,如上例所示,编译后的代码会更快,因为它只是重新调整指针,而不是实际上将两个数据结构之间的所有数据复制为一个结构数组的实现。如果上面的代码段尽可能快地运行,我愿意牺牲一些额外的内存。谢谢你的任何建议。

4 个答案:

答案 0 :(得分:3)

每次通过指针数组访问数据时,都有两次内存访问。这通常伴随着管道失速,即使在微控制器上也是如此(除非它是一个没有管道的非常小的微控制器)。

然后你必须考虑数据的大小。指针有多大? 2个字节? 4字节?结构有多大? 4字节? 8个字节?

如果结构是指针的两倍大,那么使用指针对数据进行混洗将是一半。但是,以任何其他方式读取或修改数据将更加昂贵。所以这取决于你的程序做什么。如果您花费大量时间阅读数据并且只需要一点时间,那么请优化读取数据。其他人说得对 - 个人资料。确保在微控制器上进行配置,而不是在工作站上进行配置。

答案 1 :(得分:2)

如果你的结构很小,那么拥有一系列结构并将它们随意移动实际上会更快。如果你的结构很大,如果你只是在指针周围移动,这个特定的动作会更快。

等一下......第二眼,你的代码中出现了你没有在指针周围移动,但是你正在访问这些指针所引用的结构的字段;实际上你仍然在改变结构本身,而不是指针。这比移动指针要慢,而且比移动结构更慢,因为它必须取消引用指针,然后仍然移动结构。

答案 2 :(得分:0)

你是对的。指针数组会更快,但内存使用会产生开销。如果有内存使用指针,请使用它们。

答案 3 :(得分:0)

首先:这取决于。轮廓。

缓存位置将在这里统治。我希望结构非常小(代表复数?)。在FFT中,我希望通过将实部和虚部存储在单独的数组中来获得更多的收益。

然后,您可以在CPU核心之间拆分负载。

如果它是关于更大的块(比如1024个样本块),我强烈怀疑改组指针更有效率。它还允许您 - 更轻松地 - 处理来自多个线程的相同(只读)数据。移动内存是使许多迭代器无效的某种方式,通常你希望任务(即线程)在你的数据的子范围上工作,即:它们只有一个迭代器子范围。