C++中一些神秘的堆栈机制
Some mysterious stack mechanism in C++
在学习如何编写快速排序时,我遇到了一个对我来说非常不清楚的实现
void quick_sort_iterative(int start, int end)
{
range stack[32]; // 1. why 32? why not 2? why not 1024? what is it?
range * s = stack; // 2. just a simple pointer = an array?
s->start = start; // 3. are these two values currently on top of the stack?
s->end = end;
s++; // 4. how does it work? it's pushing something on the stack?
// sort as long as there are any ranges [start, end] to sort left
while (s > stack) // 5. comparing a pointer and an array and it works?
有人能给我解释一下这5件事吗非常感谢。
以下是整个代码(页面上的最后一个代码,带有说明):代码
所以。假定range
是具有两个整数参数start
和end
的某个对象。我说不出更多了。
- 无论出于何种原因,算法的设计者相信他们不需要超过32个假堆栈帧
- 数组衰减为指针。您可以将其视为
&stack[0]
- CCD_ 5当前与CCD_ 6相同
- CCD_ 7现在指向CCD_
- 数组衰减为指针。只要
s
不指向&stack[0]
,这就是真的
- 也许只是从它们的下部区域中选择的一个数字,或者可能是通过仔细检查算法的最大堆栈深度得出的。我猜是前者
- 在需要指针的上下文中使用时,任何数组变量都会自然衰减为指针
- 如果您认为"stack"数组的第一个元素是顶部,那么是的
- 给定3中的假设,则递增指针确实会移动到堆栈上的下一个元素
- 参见2。假设循环正在递减
s
,并且当它再次到达堆栈顶部时,他们希望停止
相关文章:
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 在 C++ 中使用链表进行堆栈
- 了解使用堆栈实现队列的递归调用机制
- C++中一些神秘的堆栈机制
- 使C函数指针与C++中基于C样式堆栈的调用机制一起工作