当在有限递归循环中操作大型数组时,我应该在哪一点从堆栈切换到堆?
When manipulating large arrays in a finite recursive loop, what point should I switch from stack to heap?
我非常 c++新手,我试图优化程序的速度,该程序在递归循环中对大型一维数组中的元素执行计算。实际上,一维数组存储的是3D矩阵的值,每个值都是一个浮点数。矩阵的尺寸可达1500 x 2000 x 200。
我已经读到堆栈内存的读取速度可能比堆内存快,但是是否存在一个大小限制,在这个限制下,它变得低效甚至不切实际,假设我将堆栈大小设置得足够大以容纳所有数据?
谢谢你的帮助,如果这是一个愚蠢的问题,我道歉!
PS如果你能建议任何其他技术,我应该看看,以加快我的程序,我将不胜感激!
堆栈内存和堆内存在速度上没有区别。优化代码的最佳方法是以线性方式遍历数组,以最大化缓存利用率。
假设我将堆栈大小设置得足够大以容纳所有数据,那么是否存在一个大小限制,使其变得低效甚至不切实际?
。不过,您可能希望将递归循环更改为迭代循环。除非它是一个尾递归循环,并且编译器足够聪明地对它进行优化,例如,g++从-O2开始。
在定义堆栈变量的函数中,栈变量的读取速度可能确实比堆变量快。所有其他函数只接收到指向该变量的指针/引用,这与堆分配变量类似。
将大变量放在堆栈上通常是不明智的,所以我建议采取保守的方法,将数组放在堆上(例如,使用std::vector
)。
最后,这个小的差异不太可能影响程序的整体速度。
优化通常是专家的领域,或者至少是那些深入研究分析器并对底层语言语义和硬件以及如何从高级到低级转换有足够理解的人……专家,或者想成为专家:)
- 更喜欢优化算法而不是它的实现(从一开始)
- 不要在内存周围(随机)跳跃
如果你的函数仍然太慢,那么…发布一些代码!虽然它可能更适合codereview.stackexchange.com
相关文章:
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 在 C++ 中使用链表进行堆栈
- 变量周围的堆栈'...'已损坏
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 当在有限递归循环中操作大型数组时,我应该在哪一点从堆栈切换到堆?