仅针对特定可执行文件增加堆栈大小

时间:2018-01-14 12:24:06

标签: c++ ubuntu

写下我的问题:Code execution breaking during recursion

我不想为我帐户中运行的每个应用程序增加堆栈大小。只需一个C ++可执行文件。

这样做的方法是什么?

1 个答案:

答案 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在大多数主要平台中都是可移植的。