1.函数重载的原理

名称修饰(Name Mangling)

  • 作用:编译器在编译时对函数名进行编码,生成唯一的内部标识符,使得同名函数能通过参数列表的差异被区分。
  • 示例
    void func(int a); // 修饰后可能为 _Z4funci
    void func(double b); // 修饰后可能为 _Z4funcd
    void func(int a, int b); // 修饰后可能为 _Z4funcii
  • 编码规则(编译器实现相关):
    • 参数类型会被编码(如 i 代表 intd 代表 double)。
    • 函数名前缀可能包含作用域信息(如类名、命名空间)。
    • 不同编译器(如GCC、MSVC)的编码方式可能不同,但逻辑一致。

2. 函数重载的判断依据

  • 参数列表的差异
    • 参数类型不同(如 int vs double)。
    • 参数数量不同(如 func(int) vs func(int, int))。
    • 参数顺序不同(如 func(int, double) vs func(double, int))。
  • 返回值不影响重载
    • 仅返回值不同无法构成重载(如 int func() 和 double func() 会报错)。
  • const/volatile 限定符的影响
    • 参数中的 const 可能影响重载(如 func(const int&) 和 func(int&) 视为不同)。
    • 函数返回值或函数本身的 const 属性不影响重载。

3. 底层实现流程

  1. 编译阶段
    • 编译器为每个重载函数生成唯一的修饰名。
    • 检查参数列表是否满足重载条件(如类型、数量、顺序)。
  2. 链接阶段
    • 链接器根据修饰名匹配函数调用,确保调用正确的函数实现。

4. 与C语言的区别

  • C语言不支持重载
    • C编译器不进行名称修饰,直接使用原始函数名(如 func)。
    • 同名函数会导致链接错误(multiple definition)。
  • C++的兼容性
    • 使用 extern "C" 可禁用名称修饰,使C++代码与C兼容:
      extern "C" void func(int); // 保持C风格的函数名

2.const的核心机制

 编译器层面的检查(核心机制)

const 的主要作用是编译期约束,编译器会:

  • 拒绝所有直接修改 const 变量的代码(如 *s = 'H'
  • 通过类型系统阻止隐式类型转换(如 const char* → char*

 运行阶段,真正起到保护的是操作系统对于权限的检查,字符串常量是被硬编码到只读常量节的。

  1. 操作系统内存分页机制
    • 现代操作系统通过MMU(内存管理单元)将物理内存划分为固定大小的页(通常4KB)
    • 每个页表项(Page Table Entry)包含权限标志位(读/写/执行)
    • 字符串常量所在的.rodata段会被标记为只读(Read-Only)
  2. 硬件级保护
    • 当CPU执行*s = 'H'这样的写操作时:
      1. MMU检查目标页面的权限
      2. 发现页面标记为只读
      3. 触发页错误(Page Fault)
    • 操作系统捕获页错误后:
      • 如果是合法操作(如动态加载库),可能触发写时复制(Copy-On-Write)
      • 如果是非法操作(修改只读内存),则发送段错误信号(SIGSEGV)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88025.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88025.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88025.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React Native【详解】内置 API

屏幕 Dimensions 获取屏幕信息 import { Dimensions } from "react-native"; export default function demo() {const { width, height, scale, fontScale } Dimensions.get("window");console.log(width, height, scale, fontScale); }参数为 window 时…

Selenium自动化测试常见的异常处理

在软件开发和测试领域,Selenium作为一种广泛使用的自动化测试工具,扮演着至关重要的角色。随着自动化测试的不断普及,如何在测试过程中有效捕获并处理异常,成为了每个测试工程师必须掌握的技能。本文旨在深入探讨Selenium异常处理的方法,通过丰富的案例和代码,帮助新手朋…

企业级安全实践:SSL 加密与权限管理(二)

权限管理:企业数据的守护者 权限管理的基本概念与重要性 权限管理,是指根据系统设置的安全规则或策略,用户可以访问且仅能访问自己被授权的资源,不多不少 。它是企业信息安全体系的重要组成部分,旨在确保只有授权的人…

AMAT P5000 CVDFDT CVDMAINT Precision 5000 Mark 操作 电气原理 PCB图 电路图等

AMAT P5000 CVDFDT CVDMAINT Precision 5000 Mark 操作 电气原理 PCB图 电路图等

深入浅出:语言模型中的“自回归生成”是什么?

在当今大语言模型(LLM)如 ChatGPT、GPT-4、文心一言、通义千问等风靡的时代,“自回归生成”是驱动它们流畅对话、创作文本的核心引擎。 理解它是深入掌握LLM工作原理的关键一步。本文将用清晰易懂的语言,结合实例,为你…

LLMs基础学习(八)强化学习专题(5)

LLMs基础学习(八)强化学习专题(5) 文章目录 LLMs基础学习(八)强化学习专题(5)重要性采样(Importance Sampling)权重计算逻辑两种实现形式使用注意事项 PPO 与…

深入理解“回调地狱“(Callback Hell)

"回调地狱"是异步编程中常见的问题,指由于过多嵌套的回调函数导致的代码难以理解和维护的情况。 一、什么是回调地狱 基本概念 回调地狱(Callback Hell/Pyramid of Doom)是指: 多层嵌套的回调函数形成的代码结构 代码向右缩进越来越深&…

Oracle 的 TCP.SEND_TIMEOUT 参数

Oracle 的 TCP.SEND_TIMEOUT 参数 一 参数基本概念 TCP.SEND_TIMEOUT 是 Oracle Net Services 中的一个重要参数,用于控制 TCP 数据发送操作的最长等待时间。 二 关键特性 特性说明参数类型sqlnet.ora 配置文件参数默认值none (无超时限制)单位ms, sec, min, 默…

[Nginx] 配置中的sendfile参数详解:从传统 IO 到零拷贝的性能优化

一、sendfile 是什么? sendfile 是 Nginx 中一个关键的配置参数,用于控制是否使用操作系统提供的 sendfile() 系统调用来传输文件。 sendfile on;:启用零拷贝技术,直接由内核将文件发送到网络。sendfile off;:使用传统…

(LeetCode 每日一题) 2138. 将字符串拆分为若干长度为 k 的组 (字符串、模拟)

题目&#xff1a;2138. 将字符串拆分为若干长度为 k 的组 思路&#xff1a;字符串模拟&#xff0c;时间复杂度0(n)。 C版本&#xff1a; class Solution { public:vector<string> divideString(string s, int k, char fill) {vector<string> v;int ns.size();for…

C++法则1:在 C++ 中,所有的具名变量都是左值,即使它们的类型是右值引用。

看下面例子&#xff1a; test(0)调用的是函数是&#xff1a; template<typename T> void test(T&& t) {std::cout << "右值引用" << std::endl; }test(n)调用的是函数是&#xff1a; template<typename T> void test(T& t) {st…

python如何使用正则提取文章所有形容词

在Python中使用正则表达式提取文章中的形容词需要结合语言特性处理。以下是分步解决方案&#xff1a; 英文场景解决方案&#xff08;推荐使用专业NLP库&#xff09;&#xff1a; import re import nltk nltk.download(averaged_perceptron_tagger) # 首次使用需要下载text …

低代码平台的数据归集及治理

低代码平台或无码平台&#xff0c;在建表单的时候&#xff0c;都是每一个表单一个json的格式文件&#xff0c;存储在Nosql数据库中。在开发的过程中&#xff0c;有以下主要的需求 1、json格式实时的转为关系数据库的格式&#xff0c;存入到关系数据库中 需要在流程结束的时候&…

Origin:如何使柱状图看起来悬空

想得到这样的一个没有下轴的柱状图&#xff0c;操作步骤如下: 1.点击下轴坐标轴 2.修改效果

Vite 原理深入剖析

1. 整体架构设计 Vite 的整体架构由几个关键模块组成,每个模块都对应具体的源码文件: 开发服务器:用于处理浏览器请求、模块解析和热更新。开发服务器的代码主要位于 src/node/server/index.ts。 模块解析与热更新:通过模块中间件拦截请求,处理代码转换与热模块替换。相关…

微处理器原理与应用篇---常见基础知识(5)

一、什么是嵌入式系统 嵌入式系统是一种以应用为中心、以计算机技术为基础、软硬件可裁剪的专用计算机系统&#xff0c;通常嵌入在其他设备中&#xff0c;用于实现特定功能。它广泛存在于消费电子、工业控制、汽车电子、医疗设备等领域&#xff0c;是现代智能设备的核心 “大脑…

Redis 8.0向量库 vs 传统向量数据库:大模型知识库开发选型全指南

在大模型知识库开发领域&#xff0c;向量数据库的选择直接影响系统的性能、扩展性和开发效率。随着Redis 8.0推出Vector Set数据结构并增强向量搜索能力&#xff0c;开发者面临新的选择困境&#xff1a;是采用传统专用向量数据库&#xff08;如Milvus、Pinecone&#xff09;&am…

偏向锁撤销为什么会触发STW?

偏向锁撤销触发STW&#xff08;Stop-The-World&#xff09;的根本原因在于其撤销操作需要​​全局内存一致性​​和​​线程状态确定性​​&#xff0c;具体机制如下&#xff1a; ⚙️ ​​一、偏向锁撤销的核心流程​​ ​​竞争触发撤销​​ 当线程B尝试获取已被线程A偏向的…

Java观察者模式详解

观察者模式(Observer Pattern)是一种行为型设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象(主题)的状态发生改变时&#xff0c;所有依赖于它的对象(观察者)都会自动收到通知并更新。 核心概念 观察者模式包含以下核心角色&#xff1a; ‌Subje…

创世新布控球 国标

目录 结论&#xff1a; UDP模式 对讲 平台页面设置 设备tcp被动 旧的创世版本&#xff08;平台选的设备tcp被动&#xff1b;设备侧无法设置&#xff09; 新创世从2.8改到180上&#xff0c;先UDP&#xff0c;全报文 参考文档 结论&#xff1a; 对讲的tcp主被动&#xff0…