知识卡片
接口会促逃逸
内容
具体值装入接口时常需要可寻址的数据指针,可能触发堆分配和额外 GC 压力。接口的设计收益通常大于成本,但高频热路径要用 benchmark 验证。
参考来源
- 位置:《Go语言底层原理剖析》第12章《接口与程序设计模式》12.5.3节《接口内存逃逸分析》
- 结论依据:原文明确"data字段存储了接口中具体值的指针,这是由于存储的数据可能很大也可能很小,难以预料。但这也表明,存储在接口中的值必须能够获取其地址,所以平时分配在栈中的值一旦赋值给接口后,会发生内存逃逸,在堆区为其开辟内存",并用 benchmark 证明"由于逃逸,每个操作都会进行一次堆分配",因此可以推出"具体值装入接口常触发堆分配"的结论。
- 原始内容:很容易想到,data字段存储了接口中具体值的指针,这是由于存储的数据可能很大也可能很小,难以预料。但这也表明,存储在接口中的值必须能够获取其地址,所以平时分配在栈中的值一旦赋值给接口后,会发生内存逃逸,在堆区为其开辟内存……可以看到,由于逃逸,每个操作都会进行一次堆分配,大小为4字节。