c - 使用指向结构的指针数组,还是仅使用结构数组?

标签 c data-structures signal-processing

我正在为微 Controller 开发 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;
}

我在想,如果我像上面的例子那样使用指向结构的指针数组,那么编译后的代码会更快,因为它只是重新排列指针,而不是像这样实际复制两个数据结构之间的所有数据结构数组的实现会。如果上面的代码部分运行得尽可能快,我愿意牺牲一些额外的内存。感谢您的任何建议。

最佳答案

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

那你就要考虑数据的大小了。指针有多大? 2个字节? 4字节?结构有多大? 4字节? 8 个字节?

如果结构体的大小是指针的两倍,那么使用指针对数据进行洗牌的开销会减少一半。但是,以任何其他方式读取或修改数据的成本会更高。所以这取决于你的程序做什么。如果您花费大量时间读取数据而只花少量时间对其进行洗牌,请针对读取数据进行优化。其他人说得对——个人资料。确保在您的微 Controller 上进行性能分析,而不是在您的工作站上。

关于c - 使用指向结构的指针数组,还是仅使用结构数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6541387/

相关文章:

C链表进程返回255(0xFF)执行时间2.144s

c - 为什么我不能释放内存?(调试错误)

c - 使用带有指针的比较运算符来检查它是否在地址范围内?

algorithm - 比较 2 个一维信号

Python 高通滤波器

c - 帮我找出错误

java - 我应该使用哪种键值数据结构?按值快速检索,按键快速检索

algorithm - 递归调用对完美二叉树建模的含义是什么?

algorithm - 这就是三中位数快速排序的工作原理吗?

c - 给定一个音频流,找到关门的时间(声压级计算?)