面试题答案
一键面试- 函数调用:
- 动态调度开销:
- 普通函数调用在编译期就确定了具体调用的函数地址,编译器可以进行内联等优化。而接口调用是动态调度的,在运行时才根据接口的实际类型确定要调用的具体方法。这需要额外的时间来查找方法表,定位实际要调用的函数地址,增加了函数调用的开销。
- 间接性:
- 普通函数调用直接跳转到目标函数的地址执行。接口调用通过接口类型的指针间接访问方法表,然后再找到具体的方法地址进行调用,这种间接访问带来了额外的开销。
- 动态调度开销:
- 内存分配:
- 额外的内存空间:
- 接口类型本身需要额外的内存来存储动态类型信息和指向方法表的指针。相比普通函数调用,当传递和使用接口时,会因为这些额外的存储需求增加内存占用。
- 堆分配的可能性增加:
- 在Go语言中,为了保证接口类型在不同的使用场景下都能正确工作,编译器可能会将实现接口的结构体分配到堆上(即使原本该结构体可以分配在栈上)。这是因为接口的动态特性使得编译器难以在编译期确定其生命周期,从而导致更多的堆分配,增加了垃圾回收的压力和内存管理的开销。
- 额外的内存空间: