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