→ LiloHuang: 把 reference 拷貝過去,這並不算是 Copy-on-write 07/22 10:51
→ LiloHuang: 畢竟拷貝的行為還是產生了,而且並不是在 write 時拷貝 07/22 10:54
→ LiloHuang: 所以不能稱之為是完整的 copy-on-write。 07/22 10:54
→ uranusjr: 這根本就不是 copy-on-write, 無所謂完不完整啊 07/22 11:35
→ uranusjr: 你在 C++ 拷貝 list<int *> 也會有類似行為, 但根本不會 07/22 11:36
→ uranusjr: 有人把它叫做 copy-on-write, 因為它就是單純的 copy 07/22 11:36
推 LiloHuang: 我必須要修正我的用語,這不是"真正"的 copy-on-write 07/22 11:43
→ LiloHuang: 謝謝 uranusjr 的補充 :) 07/22 11:43
→ LiloHuang: 真正的 copy-on-write 是在 write 時拷貝物件,即便是 07/22 11:45
→ LiloHuang: reference 也要在 write 時才被拷貝,而不是一開始拷貝 07/22 11:45
→ LiloHuang: 如果有一億個 list elements 搭配 COW,不會有 O(n) 的 07/22 11:46
→ LiloHuang: 拷貝成本存在於建立第二份 list 時 07/22 11:46
→ LiloHuang: 另外之所以我會用是否"完整"的用詞是維基百科對於 COW 07/22 11:48
→ LiloHuang: 的定義,某種策略上是有用指標來只到原始版本的 07/22 11:48
→ LiloHuang: 因為真正大家談及的COW,都是像 fork child process 07/22 11:50
→ LiloHuang: 在還沒有修改原始版本前,不應該存在有額外的消耗就是 07/22 11:51
→ LiloHuang: 或者應該說 C++ 拷貝 list<Foobar *> 假設 Foobar 是 07/22 11:52
→ LiloHuang: 成本超高的大物件,在寫入時作出副本,也是某種程度的 07/22 11:53
→ LiloHuang: COW,對於該大物件而言。只是 Python 根本就是建立了 07/22 11:53
→ LiloHuang: 新物件,然後把參照給換掉,因為數字是 immutable obj 07/22 11:53
→ LiloHuang: 跟 COW 的策略一點關係都沒有,因為新物件不是它建立的 07/22 11:56
→ LiloHuang: 真正的 COW 要是全自動的,對使用者來說是透明無感的。 07/22 12:02
→ LiloHuang: 另外如同維基百科寫的 std::string 有 COW 實作 07/22 12:02
→ LiloHuang: 有空的人不仿可以看看實作方法,我相信是拷貝指標 :P 07/22 12:02
推 LiloHuang: 因此用"完整"一詞會更好,完整的COW連指標都不會拷貝 07/22 12:06
→ LiloHuang: 但這還是端看實作,跟到底被 COW 的對象是什麼物件而定 07/22 12:07
想一想這樣應該真的不算COW...
python的複製本來就只是複製referance
剛剛發文的時候觀念突然跑掉...抱歉...
※ 編輯: why8ther (140.96.27.107), 07/22/2015 13:06:45