c++-函数增强
一、编译器对函数名的处理
1. C与C++的差异
-
C编译器:保留原始函数名,无额外处理。例如:
int add(int a, int b) { return a + b; }
在汇编代码中仍为
add
。 -
C++编译器:通过name mangling(名称修饰)生成唯一函数标识,格式为
_Z[函数名长度][函数名][参数类型缩写]
。例如:int add(int, int) → _Z3addii float add(float, float) → _Z3addff
作用:支持函数重载,确保链接时能区分同名不同参的函数。
2. 扩展:编译器实现差异
-
GCC/Clang:遵循Itanium C++ ABI规范,使用上述修饰规则。
-
MSVC:采用不同修饰规则,例如:
int add(int, int) → ?add@@YAHHH@Z
-
查看修饰名:可通过
nm
命令或objdump
工具查看目标文件中的符号表。
二、函数重载
1. 核心规则
-
定义:同一作用域内,函数名相同但参数列表不同(参数类型、数量或顺序不同)。
-
返回值类型不同不构成重载条件:
int add(int a, int b); // 合法 double add(int a, int b); // 编译错误
2. 本质与实现
-
通过name mangling生成唯一符号,链接时正确绑定调用目标。
-
限制:C语言不支持函数重载,因无name mangling机制。
3. 扩展:重载解析优先级
编译器按以下顺序匹配最佳函数:
-
精确匹配:参数类型完全一致。
-
类型提升:如
char
→int
。 -
标准转换:如
int
→double
。 -
用户定义转换:如类构造函数或转换运算符。
三、默认参数
1. 规则详解
-
声明位置:默认参数只能在函数声明中指定,定义中不可重复:
int add(int a, int b, int c = 100); // 声明 int add(int a, int b, int c) { return a + b + c; } // 定义
错误示例:
int add(int a, int b, int c = 100) { ... } // 编译错误
-
参数顺序:默认参数必须从右向左连续设置:
void func(int a, int b = 10, int c = 20); // 正确 void func(int a = 5, int b, int c); // 错误:c未设置默认值
2. 扩展:默认参数与函数重载的交互
-
默认参数可能导致函数重载的二义性:
void print(int a, int b = 0); void print(int a); print(10); // 错误:编译器无法确定调用哪个版本
四、内联函数
1. 核心机制
-
作用:消除函数调用开销,将函数体直接插入调用位置。
-
使用方式:
-
关键字
inline
:向编译器建议内联(非强制)。 -
GCC扩展属性:
__attribute__((always_inline))
强制内联(仍需编译器支持):inline __attribute__((always_inline)) int add(int a, int b) {return a + b; }
-
2. 适用场景与限制
-
适用:短小、频繁调用的函数(如简单数学运算)。
-
不适用:递归函数、包含循环或复杂逻辑的大函数。
-
注意事项:
-
过度内联可能导致代码膨胀,影响缓存局部性。
-
编译器可能忽略内联建议(如优化级别为
-O0
时)。
-
3. 扩展:内联函数 vs 宏函数
特性 | 内联函数 | 宏函数(#define ) |
---|---|---|
类型安全 | 是(编译器检查类型) | 否(文本替换,可能出错) |
调试支持 | 支持(有符号信息) | 不支持(预处理器阶段替换) |
作用域 | 遵守作用域规则 | 全局替换,可能污染命名空间 |
参数求值 | 参数仅求值一次 | 可能多次求值(如MAX(a++, b) ) |
五、高级扩展:C++11后的相关特性
1. constexpr
函数
-
隐式内联:C++11起,
constexpr
函数默认具有内联属性,支持编译期计算:constexpr int add(int a, int b) {return a + b; }
2. 内联变量(C++17)
-
允许在头文件中定义内联变量,避免多重定义错误:
inline int global = 42; // 允许多次包含该头文件
总结
-
函数重载依赖C++的name mangling机制,通过参数列表区分同名函数。
-
默认参数需严格遵循声明顺序规则,避免二义性调用。
-
内联函数是性能优化手段,需权衡代码体积与执行效率,优先替代宏函数以提高安全性。
-
现代C++特性(如
constexpr
)进一步扩展了内联的应用场景,支持编译期计算。
相关文章:
c++-函数增强
一、编译器对函数名的处理 1. C与C的差异 C编译器:保留原始函数名,无额外处理。例如: int add(int a, int b) { return a b; } 在汇编代码中仍为add。 C编译器:通过name mangling(名称修饰)生成唯一函数…...
BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)
BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab) 目录 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多…...
css基础之浮动相关学习
一、浮动基本介绍 在最初,浮动是用来实现文字环绕图片效果的,现在浮动是主流的页面布局方式之一。 效果/代码 图片环绕 代码 div {width: 600px;height: 400px;background-color: skyblue;}img {width: 200px;float: right;margin-right: 0.5em;}<…...
告别分库分表,时序数据库 TDengine 解锁燃气监控新可能
达成效果: 从 MySQL 迁移至 TDengine 后,设备数据自动分片,运维更简单。 列式存储可减少 50% 的存储占用,单服务器即可支撑全量业务。 毫秒级漏气报警响应时间控制在 500ms 以内,提升应急管理效率。 新架构支持未来…...
1.3 斐波那契数列模型:LeetCode 746. 使用最小花费爬楼梯
动态规划解最小花费爬楼梯问题:LeetCode 746. 使用最小花费爬楼梯 1. 题目链接 LeetCode 746. 使用最小花费爬楼梯 题目要求:给定一个整数数组 cost,其中 cost[i] 是从楼梯第 i 阶向上爬所需支付的费用。你可以从下标 0 或 1 的台阶开始爬&a…...
8.4考研408简单选择排序与堆排序知识点深度解析
考研408「简单选择排序与堆排序」知识点全解析 一、简单选择排序 1.1 定义与核心思想 简单选择排序(Selection Sort)是一种选择排序算法,其核心思想是: 每趟选择:从待排序序列中选择最小(或最大&#x…...
【个人笔记】用户注册登录思路及实现 springboot+mybatis+redis
基本思路 获取验证码接口 验证码操作用了com.pig4cloud.plugin的captcha-core这个库。 AccountControl的"/checkCode"接口代码,通过ArithmeticCaptcha生成一张验证码图片,通过text()函数得到验证码的答案保存到变量code,然后把图…...
LiteDB 数据存储与检索效率优化的最佳实践指导
一、引言 在当今数字化时代,数据处理和存储变得至关重要。对于小型项目或者嵌入式系统而言,需要一种轻量级、高效且易于使用的数据库解决方案。LiteDB 作为一款嵌入式的 NoSQL 数据库,因其零配置、易于集成等特点,受到了开发者的青睐。然而,若要充分发挥其性能优势,就需…...
WEB安全--RCE--RCE的绕过
一、回调函数的绕过(PHP) 1.1、回调函数 1.1.1、原理: 回调函数(Callback Function)指的是将函数名或匿名函数作为参数传递给另一个函数,从而在特定条件下调用该函数。 以一个常见的回调函数为例&#…...
uni-app:指引蒙层
组件说明 指引蒙层组件: 通过id标签,突出对应id中的模块; 可以自定义提示词。 点击任意位置关闭蒙层 效果展示和使用示例 切换id之后的效果: 代码实现 <template><view class="guide-mask" v-if="showMask" @click="hideMask"&g…...
什么是CMS?常用CMS有哪些?
一、内容管理系统(Content Management System) 什么是CMS:位于 Web 前端(服务器)和后端办公系统之间的软件系统,用于内容创建、编辑、审批和发布。支持文本、图片、视频、数据库等各类数字内容的管理…...
【Es】基础入门:开启全文搜索的大门
文章目录 一、Elasticsearch 是什么二、核心概念解读索引(Index)文档(Document)映射(Mapping)分片(Shard)副本(Replica) 三、基本操作入门安…...
74. Linux设备树详解
一、什么是设备树 1、uboot启动内核用到zImage,imx6ull-alientek-emmc.dtb。bootz 80800000 – 83000000. 80800000 —zImage 83000000—dtb 2、设备树:设备和树。 设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设…...
从责任链模式聊到aware接口
从责任链模式聊到aware接口 责任链是什么? 责任链模式是一种行为型设计模式,将多个对象连接成一条链,并且沿着这条链传递请求,让多个对象都有机会处理这个请求,请求会顺着链传递,直到某个对象处理它为止。…...
在win11 环境下 新安装 WSL ubuntu + 换国内镜像源 + ssh + 桌面环境 + Pyhton 环境 + vim 设置插件安装
在win11 环境下 新安装 WSL ubuntu ssh gnome 桌面环境 Pyhton 环境 vim 设置插件安装 简单介绍详细流程换国内镜像源安装 ssh 桌面环境python 环境vim 设置插件安装 简单介绍 内容有点长,这里就先简单描述内容了。主要是快速在 Win11 搭建一个 wsl 的 linux 环…...
考研408-数据结构完整代码 线性表的链式存储结构 - 单链表
单链表操作详解(C实现) 目录 单链表尾插法创建单链表头插法创建删除指定节点按值查找按序号查找插入节点完整代码示例注意事项总结 尾插法创建 #include<bits/stdc.h> using namespace std;typedef struct LNode {int data;struct LNode* next;…...
使用Python爬虫获取淘宝App商品详情
在电商领域,获取商品详情数据对于市场分析、竞品研究和用户体验优化至关重要。淘宝作为国内领先的电商平台,提供了丰富的商品资源。虽然淘宝App的数据获取相对复杂,但通过Python爬虫技术,我们可以高效地获取淘宝App商品的详细信息…...
在 VMware Workstation 17 中安装的 Ubuntu 虚拟机无法使用桥接模式
在 VMware Workstation 17 中安装的 Ubuntu 虚拟机无法使用桥接模式时,通常是由于 网络配置错误、桥接适配器选择不当或主机网络环境限制 导致。以下是详细的排查和解决方法:我采用第一步就解决了问题 1. 检查 VMware 桥接模式配置 步骤 1:…...
2025前端八股文终极指南:从高频考点到降维打击的面试突围战
2025前端八股文终极指南:从高频考点到降维打击的面试突围战 一、2025前端八股文核心考点重构 1.1 新型响应式系统三连问 Vue3信号式响应性: // 信号式响应性底层实现 const [count, setCount] createSignal(0) effect(() > {console.log("当…...
MIPS-32架构(寄存器堆,指令系统,运算器)
文章目录 0 Preview:寄存器32通用0 $zero1 $at2—3 \$v0-$v14—7 \$a0-$a38—15 \$t0-$t716—23 \$s0-$s724—25 \$t8-$t926—27 \$k0-$k128 $gp29 $sp30 $fp 指令系统运算存储器 0 Preview: MIPS架构有32位版本和64位版本,本文介绍32位版本 寄存器 正如笔者曾说…...
MySQL数据库和表的操作之SQL语句
🎯 本文专栏:MySQL深入浅出 🚀 作者主页:小度爱学习 MySQL数据库和表的操作 关系型数据库,都是遵循SQL语法进行数据查询和管理的。 SQL语句 什么是sql SQL:结构化查询语言(Structured Query Language)&…...
Ubuntu在VMware中无法全屏
Ubuntu在VMware中无法全屏 方法:安装open-vm-tools 在Ubuntu打开终端: 1.输入: sudo apt-get install open-vm-tools2.安装依赖: sudo apt-get install open-vm*3.重启Ubuntu reboot...
[C++面试] 智能指针面试点(重点)续3
[C面试] RAII资源获取即初始化(重点)-CSDN博客 [C面试] 智能指针面试点(重点)-CSDN博客 [C面试] 智能指针面试点(重点)续1-CSDN博客 [C面试] 智能指针面试点(重点)续2-CSDN博客 …...
借助FastAdmin和uniapp,高效搭建AI智能平台
在数字化办公时代,效率与协作是企业发展的核心竞争力。传统的办公工具虽然功能丰富,但在面对复杂多变的团队协作需求时,往往显得力不从心。为了解决这一痛点,我们推出了一款全新的办公AI平台,它不仅能够满足文字和语音…...
【弹性计算】异构计算云服务和 AI 加速器(四):FPGA 虚拟化技术
《异构计算云服务和 AI 加速器》系列,共包含以下文章: 异构计算云服务和 AI 加速器(一):功能特点异构计算云服务和 AI 加速器(二):适用场景异构计算云服务和 AI 加速器(…...
Unity功能模块一对话系统(5)-完善对话流程及功能
现在我们的文本仍然是单句显示的,这还不是我们想要的效果,本期让我们完善对话流程,并使用SO(ScriptableObject)来进行一段对话序列的配置和动态加载。 最终效果功能展示 功能一:场景内可根据资源序号ID来…...
Ubuntu 系统中安装 Nginx
步骤 1:更新软件包列表 在安装前,先更新系统软件包列表: sudo apt update步骤 2:安装 Nginx 通过 apt 直接安装 Nginx: sudo apt install nginx -y步骤 3:验证安装 安装完成后,检查 Nginx …...
Elasticsearch:使用 Azure AI 文档智能解析 PDF 文本和表格数据
作者:来自 Elastic James Williams 了解如何使用 Azure AI 文档智能解析包含文本和表格数据的 PDF 文档。 Azure AI 文档智能是一个强大的工具,用于从 PDF 中提取结构化数据。它可以有效地提取文本和表格数据。提取的数据可以索引到 Elastic Cloud Serve…...
如何 编译 px4
DeepSeek-R1满血版 回答完成 深度思考完成 用时27秒,搜索全网29篇资料 以下是详细的PX4固件编译教程,综合多平台及常见问题解决方案: 一、环境准备 系统要求 Ubuntu 20.04/22.04(推荐)或 MacOS 12 Windo…...
pycharm2024.1.1版本_jihuo
目录 前置: 步骤: step one 下载软件 step two 卸载旧版本 1 卸载软件 2 清除残余 step three 下载补丁 step four 安装2024.1.1版本软件 step five 安装补丁 1 找位置放补丁 2 自动设置环境变量 step six 输入jihuo码 前置: 之…...
LLaMA Factory微调后的大模型在vLLM框架中对齐对话模版
LLaMA Factory微调后的大模型Chat对话效果,与该模型使用vLLM推理架构中的对话效果,可能会出现不一致的情况。 下图是LLaMA Factory中的Chat的对话 下图是vLLM中的对话效果。 模型回答不稳定:有一半是对的,有一半是无关的。 1、未…...
Vulnhub:Digitalword.local: FALL靶机渗透
将靶机按照图中连接方式打开,fall在virtualBox中打开 信息收集 扫描得ip arp-scan -l 扫描端口 nmap -A -T4 -sV -p- 扫描目录 gobuster dir -u http://192.168.117.160 -x php,txt,html -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 一个一个…...
androidstudio安装完成后创建新的示例项目编译报错解决
项目场景: 提示:这里简述项目相关背景: 安装完成android studio想要编译一个自带的demo项目,没想到一直有编译报错,最后终于搞好了,记录下避免再踩坑。 androidstudio安装完成后创建新的示例项目编译报错…...
C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…...
QT 跨平台发布指南
一、Windows 平台发布 1. 使用 windeployqt 工具 windeployqt --release --no-compiler-runtime your_app.exe 2. 需要包含的文件 应用程序 .exe 文件 Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll 等 Qt 库 platforms/qwindows.dll 插件 styles/qwindowsvistastyle.dll (如果使…...
数制——FPGA
1、定点数 定点数的三种表示方式: 原码:符号位 绝对值 表示方法 反码:正数的反码表示 与原码表示一致,负数的反码表示 除符号位,其他位全都取反 补码:正数的补码表示 与原码表示一致,负数的补码…...
车载以太网网络测试 -25【SOME/IP-报文格式-1】
1 摘要 本专题接着上一专题对SOME/IP进行介绍,主要对SOME/IP报文格式以及定义的字段进行详细介绍,有助于在实际项目过程中对SOME/IP报文的理解。 上文回顾: 车载以太网网络测试 -24【SOME/IP概述】 2 SOME/IP-报文格式 通过上个专题介绍&a…...
Kubernetes》》k8s》》Replication Controller
RC(Replication Controller) 应用托管在kubernetes之后,kubernetes需要保证应用能够持续运行,这是RC的工作内容,它会确保任何时间kubernetes中都有指定数量的Pod在运行。在此基础上,RC还提供了一些更高级的特性,比如滚…...
力扣HOT100之矩阵:73. 矩阵置零
这道题我没有想到什么好的办法,直接暴力AC了,直接遍历两次矩阵,第一次遍历用两个向量分别记录出现0的行数和列数,第二次遍历就判断当前的元素的行数或者列数是否出现在之前的两个向量中,若出现了就直接置零,…...
天锐蓝盾终端安全防护——企业终端设备安全管控
从办公室的台式电脑到员工手中的移动终端,这些设备不仅是工作的得力助手,更是企业数据的重要载体。然而,随着终端设备的广泛使用,安全风险也如影随形。硬件设备使用不当、数据随意传输等问题频发,使得企业数据面临着泄…...
【博客】使用GithubAction自动同步obisidian和hexo仓库
使用Github Action自动同步obisidian和hexo仓库,避免手动操作。 本文首发于❄慕雪的寒舍 1. 烦恼 先来说说慕雪现在的笔记和博客是怎么管理的吧,我正在使用两套笔记软件 思源笔记:私密性高一些,不是博客的笔记都在这里面。由于思…...
UE5学习笔记 FPS游戏制作23 区分敌我,寻找敌对角色
文章目录 方法1 tag方法2 变量添加变量和函数防止队友伤害 修改Task使用球形检测查找敌人场景面板直接编辑属性 方法1 tag 角色蓝图身上有一个tag标签,可以通过标签内容区分队伍 通过ActorHasTag判断一个Actor是否有对应的标签 方法2 变量 添加变量和函数 在s…...
ECharts各类炫酷图表/3D柱形图
一、前言 最近鸡米花实现了各类的炫酷的图表,有3D柱形图、双边柱形图以及异形柱形图,好了,直接上图: 二、效果图 一个个来吧,下面就是代码啦,注意,一下图表展示的宽高均为800px*300px 三、异形横…...
AI基础03-视频数据采集
上篇文章我们学习了图片的数据采集,今天主要了解一下视频数据采集的方法。视频是由一系列图像构成的,其中每一张图片就是一帧。视频数据采集方法通常有自动图像采集和基于处理器的图像采集两种。我们学习一下如何利用python 工具和笔记本计算机摄像头进行…...
docker-compose部署prometheus+grafana+node_exporter+alertmanager规则+邮件告警
目录 一.docker-compose文件 二.配置文件 三.文件层级关系,docker-compose和配置文件位于同级目录 四.node_exporter页面json文件 五.效果展示 prometheusalertmanager邮件告警 grafana面板效果 六.涉及离线包 一.docker-compose文件 [rootsulibao prometh…...
CPM:大规模生成式中文预训练语言模型
摘要 预训练语言模型(PLMs)已被证明对各种下游自然语言处理(NLP)任务有益。最近,GPT-3 以 1750 亿参数和 570GB 训练数据引起了广泛关注,因为它具备少样本(甚至零样本)学习的能力。…...
k8s scheduler几种扩展方式的关系及区别
网上关于scheduler扩展介绍的文章很多,但都是东说一句西说一嘴,完全没有逻辑性,对于逻辑建构者看着很痛苦,这篇文章不会深入教你怎么扩展,而是教你几种扩展方式的关系和逻辑结构: 目前Kubernetes支持五种方…...
Spring Boot 3.4.3 基于 SpringDoc 2 和 Swagger 3 实现项目接口文档管理
在现代企业级应用开发中,前后端分离已成为主流模式,前端负责界面呈现,后端专注提供 RESTful API 接口。然而,接口文档的编写和维护往往是开发过程中的痛点。Spring Boot 3.4.3 结合 SpringDoc 2 和 Swagger 3,为开发者…...
前端D3.js面试题及参考答案
目录 解释 D3.js 中 enter ()、update ()、exit () 的作用及典型应用场景 描述数据连接(Data Join)的原理,如何通过 data () 方法实现数据集与 DOM 元素的动态绑定? 如何利用 datum () 实现单个元素的数据绑定?与 data () 有何区别? 在动态数据更新时,如何通过 merge…...
Docker实现MySQL主从复制配置【简易版】
Docker实现MySQL主从复制配置 环境准备 安装docker 拉取MySQL 8.0镜像 docker pull mysql:8.0#检查 docker images | grep mysql代码流程 由于Mysql8.0的ssl验证十分繁琐,在创建容器的时候一定要禁掉 创建自定义网络 docker network create mysql-replication-ne…...