[問題] 類別函式寫在外面? & 何不全使用inline?

看板C_and_CPP作者 (薯)時間3年前 (2020/09/04 11:12), 編輯推噓5(5024)
留言29則, 9人參與, 3年前最新討論串1/1
以下廢話只是要表達自己是個初學者,如果問了笨問題還請海涵 ===================================================================== 大家好 先簡述一下我程式語言菜鳥的歷程 我接觸程式語言是大學的課程,人生第一個程式是c 但是教授為了授課內容很快就跳c++(至少上課範例程式都直接存成cpp) 但可能是因為學店的關係吧,其實也沒講多少深入的東西 後來大三進入java的世界,然後深入學習java下的OO概念。 我其實不知道自己學到怎樣的程度,只能說比較基本的沒問題, reflect以後的比較沒在碰。 一個月前借了《c++全方位學習》回來摸索c++,最近才讀到類別的章節 發現有些東西跟java的OO概念有點衝突,好不適應XDD 必須要放空去學習 ===================================================================== 1.為何要賦予可實作成員函式於定義類別之外(想請問這個動作有術語嗎)? class CRectangle { int x, y; public: void set_values (int,int); int area (void) { return (x*y); } } void CRectangle::set_values (int a, int b) { x = a; y = b; } 為什麼成員函數不在定義類別的時候就決定好,而要在定義類別之外才補完? 是為了提供類似java OO的抽象函數的概念嗎? (例如定義一個類別叫做動物,動物會"移動", 但實際上怎麼移動是由子類別去實作,所以 動物類別在移動這個成員函式就先不實作。 請問cpp有這個彈性的原因如上述嗎?) 2.inline 好像很棒,預設為何不直接inline? 根據網路資料裏頭提到(大學課程的教材:C++物件導向及增進效率程式技巧) 在 class 內部直接定義完整的函數,和只定義函數的原型而把具體實現放在 class 外部的唯一區別在於,在第一種情況中,編譯器(compiler) 會自動將函數作為 inline 考慮,而在第二種情況下,函數只是一般的 class 成員函數。 然後我又去查inline是什麼東東,以我的了解是: 編譯器會對加上inline的函式進行評估, 當展開函式內容比呼叫函式所花的成本還小時就會直接展開函式 而編譯器也會評估,如果展開後的效益不夠,即便函式加上inline 編譯器也不會進行展開。 如果以上我的了解是正確的 那為何cpp不預設所有函式都是inline的作法? 反正展開的效益有編譯器為我們把關來決定展開與否不是嗎? 為什麼會像現在這樣要由使用者自己決定是否要加inline呢? -- ┌─────────────────────────────────┐ │A)台南無糖紅茶 E) │ │B)金馬青梅綠 F)日月潭紅茶拿鐵 │ │C)台北金桔毛峰茶 G)桃園芋泥可可 歡迎光臨裏洽茶鋪 │ │D)竹南純手工愛玉冰 今晚你想來點什麼? │ └─────────────ψliu2007 ───────────────┘ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.192.225.144 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1599189173.A.E56.html

09/04 12:03, 3年前 , 1F
inline 只是keyword. compiler 可以自行決定是否inline
09/04 12:03, 1F

09/04 12:08, 3年前 , 2F
1. 分別叫做 declaration / definition
09/04 12:08, 2F

09/04 12:08, 3年前 , 3F
如果 class A、B 互相依賴的話應該就只能分開寫了,有
09/04 12:08, 3F

09/04 12:08, 3年前 , 4F
時後還會有編譯時間、可讀性等考量
09/04 12:08, 4F

09/04 12:12, 3年前 , 5F
2 C++ 的 inline 不單單是指要不要 inline function,
09/04 12:12, 5F

09/04 12:12, 3年前 , 6F
在寫 header only library 時為了避免 multiple defini
09/04 12:12, 6F

09/04 12:12, 3年前 , 7F
tion,會幫寫在 header 裡的 function 加 inline 關鍵
09/04 12:12, 7F

09/04 12:12, 3年前 , 8F
09/04 12:12, 8F

09/04 12:13, 3年前 , 9F
用來告訴 linker 在 link 階段看到多個 definition 是
09/04 12:13, 9F

09/04 12:13, 3年前 , 10F
正常的,不要報錯
09/04 12:13, 10F

09/04 12:15, 3年前 , 11F
你喜歡的話可以全寫在一起塞在標頭檔裡面,分開寫的理
09/04 12:15, 11F

09/04 12:17, 3年前 , 12F
由主要是想縮短編譯時間or不想給別人看程式碼
09/04 12:17, 12F

09/04 12:18, 3年前 , 13F
然後C++使用者喜歡自己做決定,不想讓編譯器"預設"
09/04 12:18, 13F

09/04 12:49, 3年前 , 14F
因為inline跟noninline在odr規範上面有差
09/04 12:49, 14F

09/04 12:54, 3年前 , 15F
inline要translation unit有看到definition才行
09/04 12:54, 15F

09/04 13:00, 3年前 , 16F
因為全部 inline binary 會肥死吧 orz
09/04 13:00, 16F

09/04 13:03, 3年前 , 17F
你要不要先換一本書
09/04 13:03, 17F

09/04 15:59, 3年前 , 18F
在討論 inline 以前, 你知不知道 include 是在做什麼
09/04 15:59, 18F

09/04 15:59, 3年前 , 19F
事情? 它和 import 有什麼不一樣? 當多個原始碼檔案
09/04 15:59, 19F

09/04 15:59, 3年前 , 20F
都 include 相同的標頭檔 (類別定義), 編譯時會發生
09/04 15:59, 20F

09/04 15:59, 3年前 , 21F
什麼事? 因為你還沒辦法回答上面的問題, 所以才會有
09/04 15:59, 21F

09/04 15:59, 3年前 , 22F
奇怪的結論
09/04 15:59, 22F

09/04 19:16, 3年前 , 23F
其實借什麼書都不重要...重要的是你有沒有真的翻過...我
09/04 19:16, 23F

09/04 19:17, 3年前 , 24F
是不太信inline這種東西需要找本好書才會有正確的觀念...
09/04 19:17, 24F

09/04 19:17, 3年前 , 25F
不過當你說java的OO跟C++有衝突時我是覺得你該靜下心來決
09/04 19:17, 25F

09/04 19:18, 3年前 , 26F
定好其中一本給他翻完...就是完全不太需要動腦的翻完...
09/04 19:18, 26F

09/05 00:56, 3年前 , 27F
inline每個地方都要展開占用一份記憶體會讓程式變肥
09/05 00:56, 27F

09/05 00:56, 3年前 , 28F
從省空間的角度預設不inline才是比較好
09/05 00:56, 28F

09/06 10:56, 3年前 , 29F
inline 不一定會變快 https://tinyurl.com/j34kmle
09/06 10:56, 29F
文章代碼(AID): #1VKR2rvM (C_and_CPP)