“局部变量在栈上,Box 和 Vec 在堆上”这句话怎么验证?栈到底多大?放不下会怎样?栈分配比堆分配快多少?这篇都用真实运行回答。
编译:成功
运行(退出码 0):
局部变量 local 0x16f59e4d8
数组 [u8; 64] 0x16f59e4e0
Box<u64> 的数据 0x101245300
Vec 的缓冲区 0x101245130
String 的缓冲区 0x101245170
字符串字面量 0x100899d78
static 0x100899e08
box 变量本身 0x16f59e520
被调函数的局部 0x16f59e3b0
main 函数代码 0x100860dc0Box 见Box<T> 与堆分配。
编译:成功 ulimit -s(主线程栈上限,KiB):8176 (深度用二分法测量:下面分别对主线程与子线程找到最大不溢出的递归层数) 编译:成功 主线程:每层约 150 字节栈帧,递归深度约 43468 层时还正常,再深就栈溢出(误差约 2%) 子线程(默认栈):每层约 150 字节栈帧,递归深度约 10884 层时还正常,再深就栈溢出(误差约 2%) 递归 400 万层:被信号 6 终止;stderr:['fatal runtime error: stack overflow, aborting']
线程栈大小见线程创建与 Join。
编译:成功
16 MiB 数组放栈上:被信号 6 终止;stderr 末行:['fatal runtime error: stack overflow, aborting']
编译:成功
运行(退出码 0):
16 MiB 放在堆上:b[100] = 0,长度 16777216 编译:成功
运行(退出码 0):
栈上 [u8; 256] 每轮 3.39 ns
堆上 vec![0u8; 256] 每轮 12.25 ns(分配 + 释放)耗时是本机 release 微基准;栈上版本可能被优化器部分消除,只用于量级比较。