拷贝

C语言:浅拷贝与深拷贝

最后都变了- 提交于 2020-01-10 15:23:27
这里先简单讲一讲c中的浅拷贝与深拷贝,关于更深层使用的拷贝构造函数,深拷贝构造函数,浅拷贝构造函数等,以及其他语言的深拷贝这里就不赘述了。结构体跟类其实很类似,不管是使用或者作用域上。 浅拷贝:表层的引用,实际指向同一块内存 深拷贝:存放在不同的内存空间当中 typedef struct{ char name[20]; int age; }student; student stu1; student stu2; stu1.name="kkk"; stu1.age=20; stu2=stu1; printf("stu1 addr=%p, addr stu1.name=%p\n",&stu1,stu1.name); printf("stu2 addr=%p, addr stu2.name=%p\n",&stu2,stu2.name); 调试可以发现stu1和stu2地址相同,因为二者指向的是同一块内存,如果后面调用 free(stu1); free(stu2); 则会挂掉,因为重复释放了 至于深拷贝,可以给stu2单独分配一块空间,然后再把内容拷贝过去。 参考: https://blog.csdn.net/q2519008/article/details/88310012 https://blog.csdn.net/sinat_35297665/article/details

欢乐C++ —— 5. 类的初始化

坚强是说给别人听的谎言 提交于 2020-01-10 11:16:08
本文测试内容大部分都是参考该博文 https://www.cnblogs.com/cposture/p/4925736.html 该博文作者深入汇编,写的十分详细,感谢作者大大。 之所以挪一次,是想精简一下,并且补充一些东西。 简述 先简单看看直接初始化和拷贝初始化的定义,然后再详细试验一下不同的拷贝初始化场景会调用哪种拷贝函数。实验环境 vs2017 已关闭编译器优化。 直接初始化和拷贝初始化 类的初始化分为直接初始化和拷贝初始化。 直接初始化就是在定义对象时不使用 = 号的初始化方式。调用普通构造函数。 string s1("123"); string s2(s1); 在c++11中,容器调用 emplace 成员函数创建的元素也进行直接初始化。 而拷贝初始化分很多情况,将会在以下情况发生。 在用 = 定义变量时。 函数调用时将 实参对象 传给 非引用的形参对象。 函数返回时返回非引用类型的对象。 用花括号列表初始化一个数组中的元素或聚合类中的成员。 某些类的某些函数也会拷贝初始化,例如容器的 insert 和 push 成员。 需要注意的是 拷贝初始化将跟据不同的情况调用不同的拷贝构造函数。 直接初始化有时会调用拷贝构造函数。例如 String s3(s1); 拷贝初始化过程中类类型的隐式转化不可忽略。许多时候,比较奇怪的语法往往是类类型隐式转化造成。 开始实验

day 16 包,random,shutil

岁酱吖の 提交于 2020-01-09 23:44:45
包:  函数过多,可以分模块文件去管理函数,模块文件过多,将模块文件分类放在一个个的文件夹中,这个文件夹就叫做包,组织结构更加清晰,合理!   模式就是被别人使用,包既然是一些模块的集合,也是被调用。   文件:     1、 被别人使用     2、当做脚本自己使用     执行文件运行时,会将执行文件的当前目录记载到sys.path的列表中 包也是模块,他是模块的集合体,所以引用包也会反生三件事情: 1、创建一个以包名命名的名称空间 2、执行包中的__init__文件,将__init__里面的代码块,加载到以包名命名的名称空间中 3、调用包内的名字必须通过包名. 的方式 # 想要在此文件引用 bbb包的m3模块 怎么做? # 第一步 在此文件 import aaa # 第二步:在aaa 的 __init__ 添加 from aaa import bbb # 第三步:在bbb 的 __init__ 添加 from aaa.bbb import m3 # 完成以上三步,那么我在此执行文件就可以引用bbb包的m3模块里面的名字。 # aaa.bbb.m3.func3() # 上面的需求满可以这么做: # from aaa.bbb import func3 # m3.func3() 总结: 1、from a.b import c . 的左边一定十个包

day 16 包,random,shutil

依然范特西╮ 提交于 2020-01-09 23:43:35
包:  函数过多,可以分模块文件去管理函数,模块文件过多,将模块文件分类放在一个个的文件夹中,这个文件夹就叫做包,组织结构更加清晰,合理!   模式就是被别人使用,包既然是一些模块的集合,也是被调用。   文件:     1、 被别人使用     2、当做脚本自己使用     执行文件运行时,会将执行文件的当前目录记载到sys.path的列表中 包也是模块,他是模块的集合体,所以引用包也会反生三件事情: 1、创建一个以包名命名的名称空间 2、执行包中的__init__文件,将__init__里面的代码块,加载到以包名命名的名称空间中 3、调用包内的名字必须通过包名. 的方式 # 想要在此文件引用 bbb包的m3模块 怎么做? # 第一步 在此文件 import aaa # 第二步:在aaa 的 __init__ 添加 from aaa import bbb # 第三步:在bbb 的 __init__ 添加 from aaa.bbb import m3 # 完成以上三步,那么我在此执行文件就可以引用bbb包的m3模块里面的名字。 # aaa.bbb.m3.func3() # 上面的需求满可以这么做: # from aaa.bbb import func3 # m3.func3() 总结: 1、from a.b import c . 的左边一定十个包

Object.assign() {...obj} JSON.Parse 等几种拷贝的区别

丶灬走出姿态 提交于 2020-01-08 22:42:47
let obj = { age: 10 } let obj1 = { grade: 1, name: { first: 'bob' } } let objS = obj1 let objA = Object.assign(obj, obj1) let objJ = JSON.parse(JSON.stringify(obj1)) let objK = { ...obj1 } console.log(objA) console.log(objJ) console.log(objK) obj1.grade = 9 obj1.name.first = 'chris' console.log(objS) console.log(objA) console.log(objJ) console.log(objK) 打印结果: { age: 10, grade: 1, name: { first: 'bob' } } { grade: 1, name: { first: 'bob' } } { grade: 1, name: { first: 'bob' } } { grade: 9, name: { first: 'chris' } } { age: 10, grade: 1, name: { first: 'chris' } } { grade: 1, name: { first: 'bob

内存映射

白昼怎懂夜的黑 提交于 2020-01-08 15:00:53
内存映射 内存映射是在进程的虚拟地址空间中创建一个映射 内存映射分类 内存映射分为两类: 文件映射:把文件的一个区间映射到进程的虚拟地址空间,数据源为设备上的文件。 匿名映射:把物理内存映射到进程的虚拟地址空间,没有数据源。 在进程的虚拟地址空间中,代码段和数据段属于文件映射,堆、栈属于匿名映射。 内存映射的原理 mmap()会返回一个指针,它指向进程虚拟地址空间中的一个地址,这样以后,进程无需再调用read或write对文件进行读写,而只需要通过ptr就能够操作 文件。但是ptr所指向的是一个逻辑地址,要操作其中的数据,必须通过MMU将逻辑地址转换成物理地址,如图1中过程2所示。这个过程与内存映射无关。 建立内存映射并没有实际拷贝数据,这时,MMU在地址映射表中是无法找到与ptr相对应的物理地址的,也就是MMU失败,将产生一个缺页中断,缺 页中断的中断响应函数会在swap中寻找相对应的页面,如果找不到(也就是该文件从来没有被读入内存的情况),则会通过mmap()建立的映射关系,从硬 盘上将文件读取到物理内存中,如图1中过程3所示。这个过程与内存映射无关。 如果在拷贝数据时,发现物理内存不够用,则会通过虚拟内存机制(swap)将暂时不用的物理页面交换到硬盘上,如图1中过程4所示。这个过程也与内存映射无关。 内存映射和读写文件的效率 read文件时

深浅拷贝

北慕城南 提交于 2020-01-08 13:07:19
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 数组浅拷贝 var arr = ['old', 1, true, null, undefined]; var new_arr = arr.concat(); var new_arr = arr.slice(); 浅拷贝:es6中有两种新方法 方法1: let [...spread]= [12, 5, 8, 130, 44]; //等同于:let spread = 浅克隆([12, 5, 8, 130, 44]) ` 方法2: Array.from(array)//创建一个新数组 数组深拷贝 //简单粗爆,就是不能拷贝函数 var new_arr = JSON.parse( JSON.stringify(arr) ); 浅拷贝的具体实现 深拷贝的具体实现 来源: oschina 链接: https://my.oschina.net/u/2285087/blog/3154772

Linux学习(二) --- 常用命令

左心房为你撑大大i 提交于 2020-01-07 23:48:53
[TOC] 一、常用命令 1、目录 cd切换 cd 路径 切换到指定路径 cd .. 上一级 mkdir:创建目录 mkdir 目录名 pwd:查看 2、查看 ll命令:查询目录内容 ll 查看当前(ls -l) ll -a 查看所有(含隐藏) ll 目录 查看指定目录 grep命令:内容过滤 //语法1 : 对其他命令的结果进行过滤 其他命令 | grep -in 条件 //-i 忽略大小写 //-n 显示行号 例如: ll | grep -i JDK //语法2 :对"指定文件"进行过滤 grep -in 条件 文件路径 例如: gerp -i create /var/log/boot.log 3、解压和压缩 tar //解压 tar -zxvf 压缩文件名 //压缩 tar -zcvf 压缩后文件 需要压缩文件夹 4、移动 mv命令 //剪切操作 mv 需要剪切文件 剪切到目录 //重命名操作 mv 需要重命名文件 新的文件名 //强制 mv -f .... cp命令 //拷贝 cp 需要拷贝内容 拷贝到位置 //拷贝目录 cp -r 需要拷贝内容 拷贝到位置 //如果目标文件已经存在,强制覆盖(-f会实现,需要取消别名 unalias cp) rm命令 //删除 rm 文件 //强制删除 rm -rf 文件|文件夹 //模糊删除 rm -rf xxx* 5、编辑 vi命令

甲骨文拷贝了亚马逊 API

那年仲夏 提交于 2020-01-07 08:48:05
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>   美国最高法院将就 Google Android 系统拷贝甲骨文 Java API 一案举行听证会,裁决 API 在版权法下的法律地位。此案的结果将对 Google 等公司产生深远影响。   API 本质上是指示计算机如何操作的语言,包含了一个与语法结构相关的命名命令表。Google 的 Android 设计兼容 Java,因此熟悉 Java 的程序员可以将经验和知识带到新的移动设备平台。为此 Android 必须拷贝相关的 Java API 命令和语法结构,甲骨文认为这种 Java API “重新实现”当于写未经授权的哈利波特小说,侵犯了其版权。然而拷贝 API 在软件行业是十分常见的做法,而甲骨文自己 也被发现拷贝了竞争对手亚马逊云服务 S3 的 API 。 来源: oschina 链接: https://my.oschina.net/u/4436414/blog/3154189

小数据池 深浅拷贝 集合

久未见 提交于 2020-01-06 03:58:09
小数据池 小数据池 ———— 缓存机制(驻留机制) == 判断两边的内容是否相等 a = 10 b = 10 print(a == b) # True is 判断两边的值内存地址是否相等 a = 10 b = 10 print(a is b) # True print(id(a)) print(id(b)) #True 4329728336 地址是一样的 小数据池的数据范围: -5 ~ 256 a = -5 b = -5 c = -5 print(id(a)) print(id(b)) print(id(c)) 代码块 :一个文件 一个函数 一个类 一个模块 终端中每一行是一个代码块 ​ 支持: 数字 字符串 布尔值 数字: 在同一代码块下,只要内容相同就采用相同的内存地址 数字在做乘法的范围-5~256 数字在做乘法的时候不能使用浮点数 字符串 在同一代码块下,只要内容相同就要采用相同的内存地址 乘法的时候总长度不能超过 20 乘法的时候中文,特殊符号乘以 1 或 0 布尔值 在同一代码块下,只要内容相同就采用相同的内存地址 小数据池 数字 ​ -5 ~256 布尔值 在同一代码块下,只要内容相同就采用相同的内存地址 乘法的时候中文符号乘以 0 ( 没有 1 ) 乘法的总长度不能超过 20 补充:小数据池的验证方法,必须先脱离代码块才能进行验证,先执行代码块的规则