看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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