Re: [問題] 新手關於 #include 的問題
※ 引述《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
→
04/09 03:33, , 1F
04/09 03:33, 1F
→
04/09 04:05, , 2F
04/09 04:05, 2F
→
04/09 04:06, , 3F
04/09 04:06, 3F
→
04/09 04:10, , 4F
04/09 04:10, 4F
→
04/09 10:55, , 5F
04/09 10:55, 5F
→
04/09 11:01, , 6F
04/09 11:01, 6F
→
04/09 11:02, , 7F
04/09 11:02, 7F
推
04/09 12:53, , 8F
04/09 12:53, 8F
推
04/09 12:56, , 9F
04/09 12:56, 9F
→
04/09 13:51, , 10F
04/09 13:51, 10F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 10 之 10 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章