答案 0 :(得分:0)
如果您真的需要大量的堆栈空间,您可以使用Boost Context并临时分配一定量的堆栈空间。这适用于每个线程级别,因此它可能无法回答您的问题。但是,正如评论中已经说过的那样,您可能应该改进算法,因为几乎不需要增加堆栈大小。
#include <boost/context/fixedsize_stack.hpp>
#include <boost/context/continuation.hpp>
void recurse(int depth)
{
std::cout << depth << std::endl;
recurse(depth + 1); // infinite recursion to test how far you can go
std::cout << depth << std::endl; // just to avoid tail recursion optimization.
}
int main(int argc, char* argv[])
{
namespace ctx = boost::context;
ctx::fixedsize_stack my_stack(100 * 1024 * 1024); // adjust stack size for your needs
ctx::continuation source =
ctx::callcc(std::allocator_arg, my_stack, [](ctx::continuation&& sink) {
// everything in here runs within a context with your custom stack.
recurse(1);
return std::move(sink);
});
// This starts the context and executes the lambda above.
source = source.resume();
return 0;
}
在使用GCC或Clang的Linux上,您也可以将fixedsize_stack
替换为segmented_stack,{{3}}会自动增长,直到内存不足为止。
Boost Context在大多数主要平台中都是可移植的。