vs2019 ,c++的STD库全局函数 _Pocma 与 _Swap_adl 的思考

news2024/12/26 9:21:05

(1)在阅读vs2019上的 STL库的 map 源码时,遇到了这个函数,之前,在别的源码中也经常出现这个函数。那么这个函数起什么作用呢?
在这里插入图片描述
在1880行,有对该函数的调用。其定义如下图:,青色箭头所指。
在这里插入图片描述
(2)该函数的形参是两个引用。在函数_Move_assign 中,实参是对两个分配器的引用,咱们c++ 里,STL 提供了一个标准分配器,就是allocator模板类。这两个引用都是对allocator对象的引用。
(3)allocator模板类的定义如下图,这里对模板类中一些不重要的函数修饰符去掉了,以突出重点,方便阅读。
在这里插入图片描述
如图所示,allocator模板,定义了默认的空的copy构造和copy赋值运算符函数。没有定义移动构造和移动赋值运算符函数。根据 c++ 语法。会代替调用其copy赋值运算符函数。但该函数为空。所以什么也不做。所以在 _Pocma 函数里,没有执行任何修改数据的代码。换句话说,有没有这行代码都一样。
(4)为了验证上面的想法,咱们修改一下电脑vs2019携带的源文件。即修改allocator模板类,如下,在copy赋值运算符函数里打印:
在这里插入图片描述

这里直接修改了 源文件。实验一下
(5)来一个实验代码如下:
在这里插入图片描述
图中的输出 “yes” 是怎么来的呢,就是因为修改了allocator模板源代码引起的。这非常神奇,也验证了咱们一丝不苟的治学精神,和融会贯通的学习方法,和我们王建伟老师的伟大教学功绩。王老师教的好,才有咱们学的好。
(6)实际上,一开始我不明白这些,是通过反汇编调试看汇编代码时,发现其执行代码没有有效的指令行。才写这篇文章,并回忆起来这个对象复制,对象移动的知识的。谢谢阅读
(7)接着,我们来分析类似的函数 _Swap_adl (…),该函数也经常出现在STL库源码中。如下图
在这里插入图片描述
在STL库 源码中,有map对象的交换函数。其中引用了 _Swap_adl (…) 函数。其两个实参是默认的 map类型的排序函数,也是STD标准库函数。如下图(按升序排序的 less 结构体):
在这里插入图片描述
less 只有默认的构造、析构、copy构造、copy赋值运算符函数。对其移动构造、移动赋值运算符的函数调用转为copy系列的调用。
_Swap_adl 的定义如下图:
在这里插入图片描述
结合到less 的源代码,可见经swap_adl 调用了less 的移动构造和移动赋值运算符函数。可见 swap_adl 在这时候并没有执行什么有用的功能。
我们也可以结合反汇编看一下:
在这里插入图片描述
可见
源码中对swap_adl 的调用就是应付,并没有产生实际有意义的代码。STD::move(…) 的返回值储存在rax 寄存器里,这个rax 的返回值没有再传给任何变量。所以对 STD::move(…) 的调用执行了个寂寞。调不调用一样。但实参变化时肯定不是这个结果。但是这样才符合 要求的语义,正确的进行对象交换。
(8)一样搞实验,我们可以修改下 less 源码。
在这里插入图片描述
在这里插入图片描述
但是实验,并没有取得预期的效果。因为对swap的汇编代码,没有任何变化,还是上面那个图。但咱们继续。。。。。
实验了一下,对less的修改,并不影响 _Swap_adl 的汇编代码。打印结果也出不来。但咱们的对函数里概念的理解是正确的。先这样啦。以后再实验 _Swap_adl 这个函数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 7 第二讲 数据类型 基础篇

🌹 引导 Commands | Redishttps://redis.io/commands/Redis命令中心(Redis commands) -- Redis中国用户组(CRUG)Redis命令大全,显示全部已知的redis命令,redis集群相关命令,近期也会…

竟大规模放弃复试!你未战先怯,别跑!

一、学校及专业介绍 长沙理工大学简称长沙理工(CSUST),位于湖南省长沙市,国家交通运输部和湖南省人民政府共建高校,湖南省“双一流”建设高校,学校由原国家交通部所属的长沙交通学院和原国家电力公司&…

高频面试题:如何分别用三种姿势实现三个线程交替打印0到100

最近面试遇到的一道题,需要三个线程交替打印0-100,当时对多线程并不是很熟悉因此没怎么写出来,网上搜了之后得到现 synchronized wait/notifyAll 实现思路:判断当前打印数字和线程数的取余,不等于当前线程则处于等待…

前端:横向滚动条,拖动进行左右滚动(含隐藏滚动条)

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

【算法系列篇】位运算

文章目录 前言什么是位运算算法1.判断字符是否唯一1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 丢失的数字2.1 题目要求2.2 做题思路2.3 Java代码实现 3. 两数之和3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 只出现一次的数字4.1 题目要求4.2 做题思路4.3 Java代码实现 5.…

数据库范式以及drop、delete 与 truncate区别

数据库范式了解吗? 我们从一个数据库设计的初始化阶段开始, 但是并没有规范化设计的背景知识 而要求我们设计一个员工管理系统, 可能得到表结构如下: 数据异常 首先这个表有如下问题: 1. 数据冗余: 我们可以看到部门名称相同时, 部门地址也是重复的 因此会重复存储数据 …

【UE5】给模型指定面添加自定义材质

实现步骤 1. 首先我们向UE中导入一个简单的模型&#xff0c;可以看到目前该模型的材质插槽只有一个&#xff0c;当我们修改材质时会使得模型整体的材质全部改变&#xff0c;如果我们只想改变模型的某些面的材质就需要继续做后续操作。 2. 选择建模模式 3. 在模式工具栏中点击…

手机改图片文字软件有哪些?简单分享这几款

手机改图片文字软件有哪些&#xff1f;现在有很多手机APP可以帮助我们实现图片中文字的提取和修改&#xff0c;但是其中一些工具可能会缺乏一些必要的功能&#xff0c;或者不太适合某些特定的用途。在这篇文章中&#xff0c;我们将介绍几款非常实用的手机改图片文字软件。 第一…

复杂性管理与重复性管理

在前面我们说到了所谓的"计算机科学", 重点在于如何控制大型系统的复杂性. 复杂性本身当然也是个很大的话题, 而一种常见的复杂性的来源则是重复性, 即是由不断的重复所带来的复杂性. 重复性带来的复杂性常被人忽视, 大概是因为一开始它是不起眼的, 而当人们意识到它…

软技能的重要性:在面试中展示团队合作与沟通能力

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

2023年下半年西安/广州/深圳软考(中/高级)开班啦!!!

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成项…

​LeetCode解法汇总1448. 统计二叉树中好节点的数目

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一棵…

初识Java 3-1 控制流

目录 if-else语句 迭代语句 for循环 for-in语法 return break和continue 标签机制 switch 本笔记参考自&#xff1a; 《On Java 中文版》 Java不允许将数字作为布尔值使用&#xff0c;若需要在一些条件语句中使用一个非布尔值&#xff0c;比如if(a)&#xff0c;那么就需…

美团北极星榜单,服务零售的医美新样本

事实证明&#xff0c;任何时候&#xff0c;人们对美的追求都是刚需&#xff0c;只是有时候被压抑了。 德勤中国的《中国医美行业2023年度洞悉报告》&#xff08;以下简称“报告”&#xff09;显示&#xff0c;中国医美市场规模预计在2023年超过2000亿元&#xff0c;实现20%增速…

残差网络、Dropout正则化、Batch Normalization浅了解

残差网络&#xff1a; 为什么需要残差网络&#xff1a; 残差网络的目的是为了解决深度神经网络在训练过程中遇到的退化问题&#xff0c;即随着网络层数的增加&#xff0c;训练集的误差反而增大&#xff0c;而不是过拟合。残差网络的优点有以下几点&#xff1a; 残差网络可以…

上门服务系统|上门服务软件开发|上门服务改善生活质量的便捷之选

随着现代生活的快节奏和社交距离的需求&#xff0c;我们越来越渴望能够以更便捷、高效的方式获得我们所需的服务。为了满足这一需求&#xff0c;我们公司开发了一款创新的上门服务系统&#xff0c;旨在将便利与质量相结合&#xff0c;为您提供无与伦比的体验。 无论您是忙碌的白…

惠普NS1020激光打印机碳粉警告提示及添加碳粉方法

本文也适用于惠普NS1020、1020c 和 1020w 系列打印机。 通过碳粉量指示灯检查碳粉量。 如果碳粉量是满的或指示器显示 1&#xff0c;可选择添加一个碳粉或者忽略不添加。如果碳粉量指示灯显示 2或 2 和碳粉量警告感叹号图标 &#xff0c;则表示碳粉量不足或严重不足&#xff0…

ORACEL 账户被锁定、无监听

现象1&#xff1a;oracle数据库账号被锁定 OA页面情况&#xff1a;OA系统可以正常登录&#xff0c;但是表单查不出数据 PL SQL 连接情况&#xff1a;有明确的提示&#xff0c;oracle账号被锁。 Tomcat控制台情况&#xff1a;有明确提示账号被锁 解决办法 在命令行中输入就可…

批量身份证图片转Excel,核验真伪,保留头像,只需一款软件

你是否曾经遇到过需要将大量员工的身份证图片转化为Excel表格的情况&#xff1f;这种情况可能会让你感到无从下手。但是&#xff0c;现在有了金鸣表格文字识别电脑客户端&#xff0c;一切都将变得轻松便捷。 首先&#xff0c;你只需要前往金鸣识别官网下载并安装金鸣表格文字识…

企业网络设备监控工具

如今&#xff0c;组织在运营业务方面面临着日益激烈的竞争和日益复杂的问题&#xff0c;在这种情况下&#xff0c;拥有以最高效率运行的网络基础设施不再是奢侈品。相反&#xff0c;对于任何希望在各自领域成为领跑者的组织来说&#xff0c;这是必要的。网络基础设施中每个网络…