我最近一直在寫SEC算法(就像這裏的http://18.7.29.232/bitstream/handle/1721.1/4015/HPCES024.pdf?sequence=2
)。起初遞歸版本,似乎拋出「堆棧溢出」異常超過200000點。我不知道爲什麼,直到我把它寫在我自己的堆棧上(使用迭代而不是遞歸),並且它在1000000點中工作正常。在指定的內存地址中調用函數。 C++
我相信當我調用函數時,處理器和變量的指令被複制到一些「隨機」分配的內存中。我還認爲,當我有一個類向量的全局變量時,它需要有一些緊湊的內存(如表格)。因爲(在我看來)當內存被分割成小部分時,向量不能「放大」並拋出「堆棧溢出」異常,因此問題在於當我有大量函數調用時(例如在某些遞歸算法中)。
所以我想我可以以某種方式說服C++它應該存儲函數實例的內存。像這裏http://www.parashift.com/c++-faq-lite/placement-new.html製作一些「函數實例」表,所以它不能混淆內存。
可能嗎?
什麼是你的矢量矢量*的*?它有多大?最好的解決方案可能只是使用更合適的集合類。 –
因爲堆棧(用於存儲函數中的局部變量,參數和返回地址)是有限的,所以在對大數據集使用遞歸時應該一直要小心,並且當遞歸到很多時,會得到堆棧溢出異常。你可以通過在堆上分配數據(例如使用'new')而不是使用局部變量來獲得這個數據。載體或類似的集合。 –
它使用兩個10^6浮點數(= 8mb)的表格,一個最大尺寸爲10^6個元素(= 2 * 4mb)的int向量,在「主SEC函數」中有一個int(最大遞歸級別爲10^6 ,這使得4mb)。假設,它使用20mb +一些內存來進行函數調用。它並不多。 –