作者Ebergies (火神)
看板C_and_CPP
標題Re: [問題] 新手關於 #include 的問題
時間Sat Apr 9 03:26:46 2011
※ 引述《littleshan (我要加入劍道社!)》之銘言:
: : 你有幾點訴求
: : 1) 效率
: : 2) 可讀性
: : 2.1) 典型的重複程式
: : 2.2) 從介面來看, 傳址不改值 and 傳參考卻會改值, 呼叫端的閱讀也會不利
: [deleted]
: 我對 reference 與 pointer 之爭沒興趣
: 但其實 A *obj_a 與 A obj_a 在閱讀的時候是有滿大的不同
: class B {
: A obj_a;
: ...
: }
: 以上這種情況型塑的是很清楚的 B has-a A
: obj_a 在 B object 建立時跟著被建立
: 而且在 B object 解構時跟著被解構
: A *obj_a 呢?這可能性就很多了
: 它可能只是另一個生命週期與 B 完全無關的物件
: 也可能根本指向 NULL
: 所以如果要型塑 has-a 的關係
: 我會先使用 A obj_a 的方式
: 除非 compile 速度慢到讓人受不了再去用 pimpl 統一解決
老實說我覺得會有這種習慣上的差異可能跟接觸的實務不同有關
一般而言,閱讀你介面的人並不需要去在意 private members
也因此在變數的宣告上我不認為會有閱讀上的問題 (也因此之前的討論集中在函式上)
更何況這個關係還可以藉由命名法解決
這麼說不代表我從來不在 class 內以變數形式宣告物件,而要看物件的使用情況
(value type? reference type?)
噢,回到討論的源頭,如果在 class 內以變數形式宣告的 type
我同意 include 其 header 是有必要的。
: : 好吧,最後談到效率
: : 的確很多時候透過指標取值的效率會有點差異
: : 但是或許還有另一點值得注意
: : 就是複製整個複雜的 structure 遠比複製指標還慢
: : 一般的情況下連 string 這種小東西都有人建議多使用 const string &s 取值了
: : 而通常我們都能夠分辨哪些東西是夠小,夠常被存取的東西
: : 哪些東西是很大,我們不常重複的存取整份資料的東西
: : (Managed C++ 把它們分為 value class/ ref class)
: : (或者你也可以用 struct 與 class 區分它們)
: : 而就我的經驗,使用 pointer 的機會應該遠比直接存取變數情況要多得多
: : 當然,那些情況使用 pointer 的效率比較好,程式碼也比較單純
: : 尤其是在使用 vector 將你的 class 裝起來的時候
: 效率上來說
: 若把具有 has-a 關係的成員宣告為 pointer
: 代表你在建構式中需要呼叫 new 來為它配置記憶體
: 因此建構物件時會明顯比較慢
: 如果你把 obj_a 宣告為 A
: 這些 new 的時間成本都會消失
: 因為在 stack 上配置物件的空間基本上是零成本的
: 除非說 A 的建構式自己會去呼叫 new
的確是這個樣子,但實際上一個初始化過程繁複的 class
它通常不會短期內被建構幾十萬次
: 另外如果 B has-a A object
: 那麼把 obj_a 宣告為指標並不能增加複製物件的效率
: 因為 B has-a A
: 意味著 B 在解構時也會負責把 obj_A 解構
: 因此在進行 assignment 時也要一併進行所有權的轉移
: 比如下列的 code 會造成 runtime error:
: 所以你要嘛就是在 assign_a 裡面自己做一次 copy
: 不然就是在呼叫 assign_a 之前自己用 new 來複製一份
: (不過第二個方法不好...誰知道 B 的解構式是不是用 delete 來解構 obj_a 呢?)
: 只要 B 與 A 的關係是 has-a
: 那針對 obj_a 的 assignment 是無法避免地要複製所有 A 的內容
而相對的,一個有複製需求的 class
通常是純粹用來當做純 data 使用的 struct
而需要考慮 B 會不會用 delete 來解構 obj_a 的問題之所以會出現
很大一部分的原因是因為架構根本就錯了
簡言之,我當然不會認為在任何情況下都只能使用某一種做法
正如之前講的,選擇什麼方法實作各有它適用的地方
實務上 class 使用 pointer 存取情況比較多,僅僅是這樣而已
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 175.180.111.210
→ loveme00835:你的概念還在程序導向的階段... 04/09 03:33
→ loveme00835:Association, Aggregation, Composition 這三種語意的 04/09 04:05
→ loveme00835:差別, 還有不同物件的存活時間造成策略差異, 不是只有 04/09 04:06
→ loveme00835:三兩句就能決定的 04/09 04:10
→ Ebergies:我不確定你是根據甚麼判斷我的概念還在程序導向階段呢? 04/09 10:55
→ Ebergies:相對的, 正因為 aggregation 幾乎只能使用指標實作 04/09 11:01
→ Ebergies:單純使用變數 (其實不用指標真的很麻煩) 的機會就更少了 04/09 11:02
推 littleshan:大概可以打住了 因為我和板主說的都是composition 04/09 12:53
推 littleshan:aggregation用指標沒錯,composition就不一定了 04/09 12:56
→ Ebergies:哈哈,也對已經開始洗板了 LOL 04/09 13:51