在指定的内存地址中调用函数。 C ++

时间:2012-09-01 09:54:27

标签: c++ function memory-management

我最近写过SEC算法(就像这里http://18.7.29.232/bitstream/handle/1721.1/4015/HPCES024.pdf?sequence=2)。在第一个递归版本,它似乎抛出超过200000点的“堆栈溢出”异常。我不知道为什么直到我把它写在我自己的堆栈上(使用迭代而不是递归)并且它在1000000点上运行良好。

我相信当我调用函数时,处理器和变量的指令被复制到一些“随机”分配的内存中。我还想,当我有一个类向量的全局变量时,它需要有一些紧凑的内存(如表)。

问题是当我有大量的函数调用时(例如在一些递归算法中),因为(在我看来)当内存被分成小部分时,向量不能“放大”并抛出“堆栈溢出”异常。

所以我认为我可以以某种方式说服c ++应该存储函数实例内存。像这里http://www.parashift.com/c++-faq-lite/placement-new.html制作一些“函数实例”表,所以它不会弄乱内存。

有可能吗?

1 个答案:

答案 0 :(得分:0)

永远不会出现堆栈溢出错误的vectorvector在堆上分配它的内存,它可以达到总内存(包括虚拟内存)的大小。

另一方面,堆栈是一个(相当)小的内存,程序存储函数局部变量以及其他东西。

当你调用一个函数时,这些是写在堆栈上的一些数据:

  • 可能是一些寄存器
  • 堆栈指针
  • 可能有一些返回值的空间
  • 函数参数(如果有)
  • 基本指针
  • 新函数的局部变量

根据架构/编译器,可能还有其他数据。

因此,即使最简单的函数也会在堆栈上占用最少量的内存来调用。幸运的是,当函数返回时,这些内存再次可用。但是,虽然此函数尚未返回,但这些数据仍然存在。因此,如果您一遍又一遍地递归调用函数,则所有这些数据都会相互堆叠。如果你没有尽快结束你的递归函数,你将会耗尽内存,你将收到堆栈溢出错误。

如果您感到好奇,可以在函数中添加额外的变量(确保它们没有得到优化),并且看到以较少的点数得到此错误。

您的解决方案,其他人在评论中说过,因此使用迭代方法,基本上使用std::stack模拟调用堆栈。