面试题答案
一键面试定义和语法区别
- 函数指针:
- 定义:函数指针指向一个具体的函数,它的类型由函数签名决定。例如,有函数
fn add(a: i32, b: i32) -> i32 { a + b }
,那么对应的函数指针类型为fn(i32, i32) -> i32
。 - 语法:声明函数指针变量时,使用
fn
关键字。如let func_ptr: fn(i32, i32) -> i32 = add;
,调用时直接像函数一样使用func_ptr(1, 2)
。
- 定义:函数指针指向一个具体的函数,它的类型由函数签名决定。例如,有函数
- 闭包:
- 定义:闭包是一个可以捕获其周围环境中变量的匿名函数。它可以根据捕获的变量情况,生成不同的实例类型。
- 语法:闭包使用
|参数| {代码块}
形式定义。例如let closure = |a: i32, b: i32| -> i32 { a + b };
,参数类型和返回值类型通常可省略,由编译器推断。调用方式同函数closure(1, 2)
。
性能优势
在简单数值计算场景下,闭包可能在性能上比函数指针更具优势,原因如下:
- 类型推断和单态化:闭包通常可依赖编译器进行类型推断,编译器在单态化过程中,会为闭包生成特定类型的代码。这意味着对于特定的输入类型,生成的代码是高度优化且针对性强的。而函数指针由于类型固定,在不同类型参数使用时可能需要额外的间接层,导致性能损耗。
- 捕获环境变量:如果简单数值计算依赖于周围环境中的某些变量,闭包捕获这些变量后,编译器可对捕获变量和闭包内代码进行优化整合。而函数指针本身不能捕获环境变量,若要实现相同功能,可能需要通过传递额外参数,这在一定程度上增加了函数调用开销。