C_and_CPP 板


LINE

※ 引述《Clangpp (Clang++)》之铭言: : 利用move来减少复制一份的成本 : 但是我想问背後的到底是怎麽达到的?? : 要去研究编译器的行为 丑话先说在前头 move 对 POD type 来说并不会变快 得益的只有掌握资源的 class type 比如说 string、vector 等等 这类 class 在建构时会配置记忆体或其它种类的资源 因此在复制时必须使用 deep copy 以确保资源不会重覆释放 以 string 来说,假设 a, b 都是 string class, 然後我们写 a = b 时 设计 string class 的人知道我们不能放任 C++ 直接复制指向字元阵列的指标 这样当 a 与 b 都解构时会造成 double delete 因此他会在 copy assignment 中另外配置记忆体并且把资料完整复制 执行完 a = b 之後,a 和 b 都是完整而且内容相同的 string 物件 但是当你写 a = move(b) 时 意思是「我不会再使用 b 了,把 b 拥有的资源原封不动转移到 a」 执行结束後 a 拥有 b 的资源,但是 b 的内容则是 unspecified 你唯一能做的事是使用 b = XXX 来让他拥有别的内容 因此在实作 move assignment 时,只需要直接把 b 的阵列指标以及长度丢给 a 然後把 b 设定成没有内容的状态即可 做这些事不需要另外配置记忆体也不需要复制内容,自然比 copy assignment 还要快 : 问题2 : 为什麽我目前看到好像没有其他语言做这件事情?? : 像这相关的东西要如何了解?? : 谢谢 具备 move semantics 的语言并不算少见 rust 的自订型别包括 enum 与 struct 预设情况下「只有」move assignment 而且会在 compile time 把错误使用物件的情况抓出来 比如说你写 let a = String::from("abc"); // a 是字串 "abc" let b = a; // 相当於 b = std::move(a) let c = a; // 相当於 c = std::move(a) 这时候 compiler 会报错,然後跟你说在 b = a 之後 a 已经失去资源, 因此没办法再 move 到 c 上面 当然你可以为自订型别添加 copy assignment 那麽用起来就会比较接近 int float 之类的内建型别 另外 d language 的 struct 并没有所谓的 copy constructor 取而代之的是个称为 postblit function 的东西 当你在 d 里面复制一个 struct object 时 compiler 会先把 struct 所有栏位复制一份到新的 object 上 接着在新的 object 上呼叫 postblit function 它的任务是确保资源处在正确的 state 上 因此,对 POD 来说,postblit 就是什麽事都不用做, 而对其它拥有资源的 struct,postblit 就是依照原本的内容制作复本 或是增加 reference count 最後,compiler 的最佳化会消除没有必要的 postblit call 比如说若 compiler 发现 postblit 後紧接着另一个同样的物件会解构 那麽这个 postblit 与解构式会同时被消除掉 这就相当於节省了一次复制 D lang 的 postblit 比 C++ 的 rvalue 要简化许多 而代价就是 struct 内的栏位不能够包含指向同物件内其它栏位的指标 否则在上面消除 postblit 与解构式之後,执行结果可能会错误 主流的 OOP 语言如 C# 与 Java,物件通常都是 reference type 因为复制 reference 相当快速,因此自然是不需要 move semantics 而 C# 虽然有 struct,但是它没有 destructor,只能当 POD 使用 因此也不需要 move semantics (对POD来说没差) 最後,functional language 通常变数都是 immutable type immutable type 同样具备复制非常快的特性 (也是只要复制 reference 呵呵) 所以它们通常也不需要 move semantics --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.160.83.142
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1469465868.A.A4C.html
1F:推 Caesar08: 推 07/26 01:02
2F:推 james732: 推 07/26 01:06
3F:推 LPH66: 推 07/26 01:12
4F:推 Frozenmouse: 推 07/26 07:36
5F:推 Clangpp: 推 真的太感谢了!!! 07/26 07:59
6F:推 Ebergies: 推 呵呵 07/26 09:09
7F:推 shadow0326: 今天又学到了新东西 07/26 10:30
8F:推 lc85301: 推一个 07/26 20:39
9F:推 easyman: 太强了 07/26 21:35
10F:推 ko27tye: 推 07/27 01:27
11F:推 BlazarArc: 推 07/27 21:02
12F:推 Sidney0503: 推 07/30 17:55







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP