Tag: 堆叠大小

Ruby的光纤4kB堆栈大小的后果

纤维对我来说是一个相对较新的概念。 我知道每个光纤的堆栈大小限制为4kB,我继续读到我应该“小心”这个。 这个限制对现实世界的影响究竟是什么? 编辑: 似乎这个4kB限制毕竟不是这样的障碍,它需要光纤本身内的大量局部变量(4,045)才能引发SystemStackError。 count = 0 loop do count += 1 puts count varlist = String.new count.times do |i| varlist += “a#{i} = 1\n” end s = “fiber = Fiber.new do \n #{varlist} \n end \n fiber.resume” eval(s) end 不是最优雅的代码,但它似乎certificate了光纤堆栈的局限性。 好像它只是返回值,局部变量(所有这些变量都包含对堆上对象的引用)和方法调用放在堆栈上。 我还没有测试从光纤调用的方法中的局部变量等是否是光纤堆栈的一部分。 编辑2: 修改了上面的代码。 看来,被调用方法中的变量等成为光纤堆栈的一部分。 如果是这种情况,那么调用深度(即使没有递归)也可能是一个问题,因为方法本身可能需要更多的空间而不是变量(它们似乎是对堆上对象的透明引用)。 以下代码在第4,031次迭代时失败,并指示被调用方法中的变量成为光纤堆栈的一部分: count = 0 loop do count […]