当前位置: 首页 > news >正文

c++中默认参数值是怎样实现的?


author: hjjdebug
date: 2025年 05月 07日 星期三 17:51:43 CST
description: c++中默认参数值是怎样实现的?


文章目录

  • 1.什么是函数参数的默认值.
  • 2. 限制:
  • 3. C++默认参数是怎样实现的?

1.什么是函数参数的默认值.

在函数声明中,
可以在参数列表中为某些参数指定默认值
在函数调用中,
如果用户指定了参数的值,那么就使用用户指定的值,否则就使用函数原型中定义的参数的默认值。

2. 限制:

默认参数只能从右向左定义.
原因是简化与编译器的约定,方便编译器补全缺省的值. 见最后的总结.
如果不加此限制,而是规定有默认值的优先级低,右边参数默认值优先级低于左边参数默认值优先级,
编译器也能理解用户意图,原则上也能实现.
但那就要重改编译器,且比现在的要复杂一些了,似乎也没这个必要.

3. C++默认参数是怎样实现的?

看一个简单实例:

$ cat main.cpp 
#include <iostream>// 函数声明,带有默认参数
void add(int a, int b = 5) {std::cout << "Sum: " << a + b << std::endl;
}int main() {add(3);       // 使用默认值:b = 5, 输出 8add(3, 10);  // 不使用默认值,输出 13return 0;
}

其反汇编代码:

(gdb) disassemble/s main
Dump of assembler code for function main():
main.cpp:
8	int main() {0x000055555555521e <+0>:	endbr64 0x0000555555555222 <+4>:	push   %rbp0x0000555555555223 <+5>:	mov    %rsp,%rbp9	    add(3);       // 使用默认值:b = 5, 输出 8
=> 0x0000555555555226 <+8>:	mov    $0x5,%esi        // 默认值5送给了第二个参数esi0x000055555555522b <+13>:	mov    $0x3,%edi0x0000555555555230 <+18>:	callq  0x5555555551c9 <add(int, int)>10	    add(3, 10);  // 不使用默认值,输出 130x0000555555555235 <+23>:	mov    $0xa,%esi   // 调用值10送给了第二个参数esi0x000055555555523a <+28>:	mov    $0x3,%edi0x000055555555523f <+33>:	callq  0x5555555551c9 <add(int, int)>11	    return 0;0x0000555555555244 <+38>:	mov    $0x0,%eax12	}0x0000555555555249 <+43>:	pop    %rbp0x000055555555524a <+44>:	retq   
End of assembler dump.

我查看了一下: disassemble/s 与disassemble/m 其输出内容是一致的. 几乎没有差别.
一个修饰符是source ,一个修饰符是mix, 其实都一样的.

x86-64函数调用协议, %edi是第一参数,%esi是第2参数, 我们看到编译器把默认值5送给了第二个参数esi
它的前6个参数都是用寄存器传递,超过6个用堆栈传递.

跟gcc的约定是,当调用者参数少于函数原型个数时,从右侧开始补全,把默认值填上去.

相关文章:

  • MinIo安装和使用操作说明(windows)
  • Kotlin 中实现单例模式的几种常见模式
  • pcie协议复位
  • WPF MVVM进阶系列教程(一、对话框)
  • AGV导航控制器技术方案——基于EFISH-SBC-RK3576/SAIL-RK3576的国产化革新‌(新一代工业级自主可控解决方案)‌
  • Ubuntu 第11章 网络管理
  • 每日一题洛谷P1025 [NOIP 2001 提高组] 数的划分c++
  • string--OJ4
  • 铁塔基站项目用电能表有哪些?
  • LeetCode 热题 100_最长回文子串(93_5_中等_C++)(暴力破解法;动态规划)
  • Java中对象集合转换的优雅实现【实体属性范围缩小为vo】:ListUtil.convert方法详解
  • 数造科技携 DataBuilder 亮相安徽科交会,展现“DataOps +AI”双引擎魅力
  • 什么是智能合约?区块链上的自动化契约
  • si551x时钟芯片linux下调试总结
  • 【论文阅读】Adversarial Training Towards Robust Multimedia Recommender System
  • 物流无人机结构与载货设计分析!
  • 无人机上的热成像相机可以单独使用吗?
  • 准确--Notepad++ 实用的插件介绍
  • 定长滑动窗口---初阶篇
  • ​​大疆无人机“指点飞行模式”​​(TapFly)
  • 人民日报读者点题·共同关注:今天我们为什么还需要图书馆?
  • 上海劳模风采馆焕新升级后重新开放,展示480位劳模先进故事
  • 告别户口本!今天起婚姻登记实现全国通办
  • 匈牙利外长称匈方已驱逐两名乌克兰外交官
  • 中国象棋协会坚决支持司法机关依法打击涉象棋行业的违法行为
  • 胳膊一抬就疼,炒菜都成问题?警惕这种“炎症”找上门