Re: [問題] 建構元初始化

看板C_and_CPP (C/C++)作者 (Python語法真精簡 Orz)時間19年前 (2006/02/16 00:21), 編輯推噓5(509)
留言14則, 5人參與, 最新討論串1/1
※ 引述《justinC (無)》之銘言: : 請問用串列初始化 : 跟 在建構元內寫指定來初始化兩個差異性在哪 各有啥好處 我聽過的翻譯是叫 "初始化串列" " initial list " 差在用 initial list 時, object 會呼叫 constructor 會比較快. 在 {} 裡叫用 operator = 會比較慢一點, 你多呼叫了一個函式. 以下為例 : class Student { public: // version1 : use initial list. Student( const string& str ) : name( str ) // just call copy constructor. {} // version2 : non-use initial list. Student( const string& str ) { // compiler 會偷偷插入 name::string()呼叫預設建構子初始化 name = str; // call string::operator=. } string name; }; note: version1 和 version2 不可能同時存在. (這裡是example XD) version1: name 呼叫 class string 的建構子. <= 只呼叫一次. version2: compiler 會在建構子偷偷插入 name::string() 呼叫預設建構子. 接下來 name = str 會呼叫 class string 的 operator = (...). => 呼叫二次. note: 若 string operator = 內部實作是用動態配置記憶體的話, 你還要先 delete 掉 buffer 再重新 allocate 夠大的 buffer 然後再塞 data. 不管 operator = 實作再快, 都逃不了 compiler 偷偷塞的 預設建構子呼叫, 比 initial list 就是多了一次呼叫. 好處: (個人意見 XD) initial list : 比較快. 一般寫法 : 比較慢. 壞處: initial list : 寫時比較麻煩(其實也還好 ) 一般寫法 : 易讀. 一般來說用 initial list 都比較快. 不過我想就一般基本型別應該沒啥差 差的應該都是 user defined data. : 我只知道用串列可以初始化const 的變數 嗯, 基本上 const type variable_name 的 都一定要用 initial list 初始化. : 如果指定可以 配置動態記憶體 : 想問各個優缺點 謝謝 這個我完全看不懂你在寫啥 XD 有錯請指正 :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.192.143.24

02/16 00:47, , 1F
寫錯,編譯器偷塞的應該是 name.string::string().
02/16 00:47, 1F

02/16 00:49, , 2F
C++ Primer or efficient C++ Performance Programming
02/16 00:49, 2F

02/16 00:49, , 3F
Techniques 的第五章 都可以參考一下
02/16 00:49, 3F

02/16 01:06, , 4F
好詳細 我最後指的是 如果 char *字串 就要 allocate空間
02/16 01:06, 4F

02/16 01:09, , 5F
可以再加一點壞處 list無法事先作參數檢查或額外處理
02/16 01:09, 5F

02/16 01:10, , 6F
另外如果是基本型別 兩種效率相同
02/16 01:10, 6F

02/16 01:11, , 7F
list好處還有~ const成員的唯一初始化地方...
02/16 01:11, 7F

02/16 01:19, , 8F
我覺得參數檢查應該放在外面說,放在裡面像在測試
02/16 01:19, 8F

02/16 01:23, , 9F
沒錯誤當然最好 可是使用者通常不會這麼乖orz 保險一點
02/16 01:23, 9F

02/16 01:24, , 10F
還是做錯誤檢查比較好 可以做安全機制
02/16 01:24, 10F

02/16 01:27, , 11F
我的意思是在傳給 c'tor 前先檢查,不要放在 c'tor 內檢查
02/16 01:27, 11F

02/16 01:27, , 12F
有的時候可以確定輸入必為正確,放在 c'tor 內影響效率
02/16 01:27, 12F

02/16 01:28, , 13F
當然我想這還是要看情況就是了,沒什麼絕對的
02/16 01:28, 13F

02/16 19:31, , 14F
member initialization list
02/16 19:31, 14F
文章代碼(AID): #13yrJtzr (C_and_CPP)
文章代碼(AID): #13yrJtzr (C_and_CPP)