关于可变参数函数:为何要进行参数提升?提升顺序及规则是什么?
为什么可变参数函数的参数需要提升?提升顺序是怎样的?
这问题问到点子上了!其实背后主要是历史遗留和实现复杂度的原因。可变参数函数(比如我们天天用的printf)是从C语言继承来的特性,早年编译器的处理能力有限,为了让可变参数的实现更简单、更高效,就定下了默认参数提升这一套规则。
简单来说,就是把一些“小类型”统一升级成更通用的标准类型,这样函数内部处理可变参数的时候,不用去逐个判断传入的是char、short还是float,只需要处理int、double这些CPU优化得最好的“通用大类型”就够了——既降低了底层实现的复杂度,也能让程序运行得更顺畅。
那具体的提升规则是什么呢?当你调用可变参数函数时,会先完成几个基础转换:左值转右值、数组转指针、函数转指针,之后才会进行默认参数提升,具体规则如下:
std::nullptr_t会被转换为void*- float类型参数会按照浮点提升规则,直接转成double
- bool、char、short,以及无作用域枚举类型,会按照整数提升规则,转换为int或者比int更宽的整数类型(比如有些平台上char和int宽度相同,那可能就不变,但绝大多数场景下都会转成int)
内容的提问来源于stack exchange,提问作者Fabio Di Lieto
相关产品推荐
相关产品推荐

