草庐IT

callstack

全部标签

c# - 异步递归。我的内存到底去哪儿了?

这个问题更多是出于好奇,而不是针对任何现实世界的问题。考虑以下代码:voidMain(){FAsync().Wait();}asyncTaskFAsync(){awaitTask.Yield();awaitFAsync();}在同步世界中,这最终会导致堆栈溢出。在异步世界中,这只会消耗大量内存(我假设这与我可能松散地称为“异步堆栈”的东西有关?)这些数据究竟是什么,它是如何保存的? 最佳答案 好问题。堆栈是延续的具体化。简单地说,继续是关于程序接下来要做什么的信息。在传统的非异步环境中,这表示为堆栈上的返回地址;当方法返回时,它查看

c# - 异步递归。我的内存到底去哪儿了?

这个问题更多是出于好奇,而不是针对任何现实世界的问题。考虑以下代码:voidMain(){FAsync().Wait();}asyncTaskFAsync(){awaitTask.Yield();awaitFAsync();}在同步世界中,这最终会导致堆栈溢出。在异步世界中,这只会消耗大量内存(我假设这与我可能松散地称为“异步堆栈”的东西有关?)这些数据究竟是什么,它是如何保存的? 最佳答案 好问题。堆栈是延续的具体化。简单地说,继续是关于程序接下来要做什么的信息。在传统的非异步环境中,这表示为堆栈上的返回地址;当方法返回时,它查看

c++ - C 编译器可以重新排列堆栈变量吗?

我过去曾参与过嵌入式系统的项目,我们重新安排了堆栈变量的声明顺序以减小生成的可执行文件的大小。例如,如果我们有:voidfunc(){charc;inti;shorts;...}我们会将其重新排序为:voidfunc(){inti;shorts;charc;...}由于对齐问题,第一个导致使用了12个字节的堆栈空间,而第二个导致仅使用了8个字节。这是C编译器的标准行为还是我们使用的编译器的一个缺点?在我看来,如果编译器愿意,它应该能够重新排序堆栈变量以支持更小的可执行文件大小。有人建议我C标准的某些方面阻止了这种情况,但我无法找到有信誉的来源。作为附加问题,这是否也适用于C++编译器?

c++ - C 编译器可以重新排列堆栈变量吗?

我过去曾参与过嵌入式系统的项目,我们重新安排了堆栈变量的声明顺序以减小生成的可执行文件的大小。例如,如果我们有:voidfunc(){charc;inti;shorts;...}我们会将其重新排序为:voidfunc(){inti;shorts;charc;...}由于对齐问题,第一个导致使用了12个字节的堆栈空间,而第二个导致仅使用了8个字节。这是C编译器的标准行为还是我们使用的编译器的一个缺点?在我看来,如果编译器愿意,它应该能够重新排序堆栈变量以支持更小的可执行文件大小。有人建议我C标准的某些方面阻止了这种情况,但我无法找到有信誉的来源。作为附加问题,这是否也适用于C++编译器?

c++ - 堆栈内存是连续的吗?

编译器如何强制堆栈内存是连续的,它会导致每次程序运行时移动内存还是在程序运行之前在堆栈上保留程序所需的内存? 最佳答案 给定线程的堆栈通常在虚拟内存中是连续的(在Linux和类似系统上,以及在Windows的用户模式下)。Windowskernel(inWindowsVistaandabove)和z/OS允许虚拟内存中的不连续堆栈和GCC4.6willalsoallowthat.编译器根本不需要移动堆栈,即使对于堆栈的虚拟地址不连续的系统也是如此;他们只是改变新零件的分配位置。操作系统可能会将物理页面重新映射到虚拟页面,以便堆栈在物

c++ - 堆栈内存是连续的吗?

编译器如何强制堆栈内存是连续的,它会导致每次程序运行时移动内存还是在程序运行之前在堆栈上保留程序所需的内存? 最佳答案 给定线程的堆栈通常在虚拟内存中是连续的(在Linux和类似系统上,以及在Windows的用户模式下)。Windowskernel(inWindowsVistaandabove)和z/OS允许虚拟内存中的不连续堆栈和GCC4.6willalsoallowthat.编译器根本不需要移动堆栈,即使对于堆栈的虚拟地址不连续的系统也是如此;他们只是改变新零件的分配位置。操作系统可能会将物理页面重新映射到虚拟页面,以便堆栈在物

c++ - 堆栈上分配的异常如何超出其范围?

在下面的代码中,基于堆栈的变量'ex'被抛出并捕获在一个超出ex声明范围的函数中。这对我来说似乎有点奇怪,因为(AFAIK)基于堆栈的变量不能在声明它们的范围之外使用(堆栈已展开)。voidf(){SomeKindOfExceptionex(...);throwex;}voidg(){try{f();}catch(SomeKindOfException&ex){//Handlingcode...}}我在SomeKindOfException的析构函数中添加了一个print语句,它表明ex一旦超出f()的范围就会被破坏,但是它会在g()中被捕获并在超出范围时再次被破坏.有什么帮助吗?

c++ - 堆栈上分配的异常如何超出其范围?

在下面的代码中,基于堆栈的变量'ex'被抛出并捕获在一个超出ex声明范围的函数中。这对我来说似乎有点奇怪,因为(AFAIK)基于堆栈的变量不能在声明它们的范围之外使用(堆栈已展开)。voidf(){SomeKindOfExceptionex(...);throwex;}voidg(){try{f();}catch(SomeKindOfException&ex){//Handlingcode...}}我在SomeKindOfException的析构函数中添加了一个print语句,它表明ex一旦超出f()的范围就会被破坏,但是它会在g()中被捕获并在超出范围时再次被破坏.有什么帮助吗?

Node.js - 超出最大调用堆栈大小

当我运行我的代码时,Node.js抛出一个"RangeError:Maximumcallstacksizeexceeded"异常,这是由于递归调用过多导致的。我尝试通过sudonode--stack-size=16000app增加Node.js堆栈大小,但Node.js崩溃且没有任何错误消息。当我在没有sudo的情况下再次运行时,Node.js会打印'Segmentationfault:11'。有没有可能在不删除我的递归调用的情况下解决这个问题? 最佳答案 你应该把你的递归函数调用包装成一个setTimeout,setImmedia

Node.js - 超出最大调用堆栈大小

当我运行我的代码时,Node.js抛出一个"RangeError:Maximumcallstacksizeexceeded"异常,这是由于递归调用过多导致的。我尝试通过sudonode--stack-size=16000app增加Node.js堆栈大小,但Node.js崩溃且没有任何错误消息。当我在没有sudo的情况下再次运行时,Node.js会打印'Segmentationfault:11'。有没有可能在不删除我的递归调用的情况下解决这个问题? 最佳答案 你应该把你的递归函数调用包装成一个setTimeout,setImmedia