我主要考虑Windows。
在这样的平台上 AFAIK 有很多堆栈,每个程序,甚至每个线程都有自己的堆栈,并且每个这样的线程都可以将字节推送到它上面 - AFAIK 每个这样的推送都应该在运行时检查,以防堆栈溢出 - 所以似乎每次推送都需要一些成本(比如数组边界检查) - 这种检查究竟是如何实现的?
我记得在旧机器上没有检查,但有些 fff 变为 000,因此没有检查成本,但今天在 Windows 平台上,在我看来,可能每个堆栈都已绑定检查 - 但我不知道它是如何实现的。
我主要考虑Windows。
在这样的平台上 AFAIK 有很多堆栈,每个程序,甚至每个线程都有自己的堆栈,并且每个这样的线程都可以将字节推送到它上面 - AFAIK 每个这样的推送都应该在运行时检查,以防堆栈溢出 - 所以似乎每次推送都需要一些成本(比如数组边界检查) - 这种检查究竟是如何实现的?
我记得在旧机器上没有检查,但有些 fff 变为 000,因此没有检查成本,但今天在 Windows 平台上,在我看来,可能每个堆栈都已绑定检查 - 但我不知道它是如何实现的。
我不知道 Windows 或 Linux 平台上有任何完全编译的语言默认调用堆栈边界检查。因此,溢出可用堆栈空间会导致分段错误,如(例如)问题Segmentation fault due to recursion和segmentation fault和stackoverflow有什么区别?.
正如问题中所观察到的,不进行边界检查的好处是代码运行得更快。如果出于某种特定原因想要进行边界检查,则可以为该特定情况插入边界检查。