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

作者: liu2007 (è–¯)   2020-09-04 11:12:47
以下廢話只是要表達自己是個初學者,如果問了笨問題還請海涵
=====================================================================
大家好 先簡述一下我程式語言菜鳥的歷程
我接觸程式語言是大學的課程,人生第一個程式是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呢?
作者: steve1012 (steve)   2020-09-04 12:03:00
inline 只是keyword. compiler 可以自行決定是否inline
作者: Lipraxde (Lipraxde)   2020-09-04 12:08:00
1. 分別叫做 declaration / definition如果 class A、B 互相依賴的話應該就只能分開寫了,有時後還會有編譯時間、可讀性等考量2 C++ 的 inline 不單單是指要不要 inline function,在寫 header only library 時為了避免 multiple definition,會幫寫在 header 裡的 function 加 inline 關鍵字用來告訴 linker 在 link 階段看到多個 definition 是正常的,不要報錯
作者: eye5002003 (下一夜)   2020-09-04 12:15:00
你喜歡的話可以全寫在一起塞在標頭檔裡面,分開寫的理由主要是想縮短編譯時間or不想給別人看程式碼然後C++使用者喜歡自己做決定,不想讓編譯器"預設"
作者: sarafciel (Cattuz)   2020-09-04 12:49:00
因為inline跟noninline在odr規範上面有差inline要translation unit有看到definition才行
作者: CoNsTaR ((const *))   2020-09-04 13:00:00
因為全部 inline binary 會肥死吧 orz
作者: loveme00835 (髮箍)   2020-09-04 13:03:00
你要不要先換一本書在討論 inline 以前, 你知不知道 include 是在做什麼事情? 它和 import 有什麼不一樣? 當多個原始碼檔案都 include 相同的標頭檔 (類別定義), 編譯時會發生什麼事? 因為你還沒辦法回答上面的問題, 所以才會有奇怪的結論
作者: protoss (天生散人)   2020-09-04 19:16:00
其實借什麼書都不重要...重要的是你有沒有真的翻過...我是不太信inline這種東西需要找本好書才會有正確的觀念...不過當你說java的OO跟C++有衝突時我是覺得你該靜下心來決定好其中一本給他翻完...就是完全不太需要動腦的翻完...
作者: DerLuna (陽月)   2020-09-05 00:56:00
inline每個地方都要展開占用一份記憶體會讓程式變肥從省空間的角度預設不inline才是比較好
作者: LiloHuang (十年一刻)   2020-09-06 10:56:00
inline 不一定會變快 https://tinyurl.com/j34kmle

Links booklink

Contact Us: admin [ a t ] ucptt.com