構(gòu)造函數(shù)中的初始化列表的內(nèi)存預(yù)設(shè)值;
說到初時(shí)化列表, 大家都會(huì)從上面發(fā)現(xiàn)這兩句話:
1. 效率更高;
2. 初始化列表初時(shí)化順序依據(jù)類定義的順序, 而不是依據(jù)初始化列表中的先后順序;
在中還會(huì)發(fā)現(xiàn):
3. 子類是無法在自己的初始化列表中初始化基類成員的;
為什么高效? 為什么要保持順序? 為什么不能初始化基類成員?
1. C++標(biāo)準(zhǔn): 一個(gè)對(duì)象, 它的內(nèi)存結(jié)構(gòu)是: (同一個(gè)訪問級(jí)別內(nèi))依照成員變量的定義順序;
其實(shí)所有的C++編譯器, 都是依照成員變量的定義順序;
2. 什么是初始化列表: 編譯期間, C++讀取初始化列表, 生成一塊靜態(tài)的存儲(chǔ)區(qū)域, 簡(jiǎn)單的說, 作為類的Static成員放置;
new 一個(gè)對(duì)象的時(shí)候, 我們?nèi)绻麍?zhí)行this.m_變量賦值, 顯然要隨機(jī)執(zhí)行內(nèi)存訪問, 這樣不是C++程序員想看到的, (低效, 我要你干啥);
反過來, 如果是初始化列表的執(zhí)行是一個(gè)MemCpy(this, 初始化里表, sizeof());就能帶來性能上的提升;
所以為了使得初始化列表能執(zhí)行高效, C++編譯器先將初始化列表在編譯期寫入到指定的內(nèi)存, 然后構(gòu)造的時(shí)候在MemCpy出來.
MemCpy操作前提是連續(xù)的內(nèi)存, 因此初始化列表嚴(yán)格執(zhí)行"依據(jù)類定義的順序";
3. 子類的構(gòu)造是分成兩部分的:
先構(gòu)造Base, 然后再構(gòu)造(Derive - Base), 考慮到在(Derive - Base)構(gòu)造之前, 要執(zhí)行初始化列表,
而如果Derive企圖初始化Base中的指定成員, 必定會(huì)導(dǎo)致內(nèi)存上的不連續(xù), 從而破壞了MemCpy優(yōu)化.
所以編譯器為了效率不支持"子類初始化列表中初時(shí)化基類成員".
說到初時(shí)化列表, 大家都會(huì)從
1. 效率更高;
2. 初始化列表初時(shí)化順序依據(jù)類定義的順序, 而不是依據(jù)初始化列表中的先后順序;
在
3. 子類是無法在自己的初始化列表中初始化基類成員的;
為什么高效? 為什么要保持順序? 為什么不能初始化基類成員?
1. C++標(biāo)準(zhǔn): 一個(gè)對(duì)象, 它的內(nèi)存結(jié)構(gòu)是: (同一個(gè)訪問級(jí)別內(nèi))依照成員變量的定義順序;
其實(shí)所有的C++編譯器, 都是依照成員變量的定義順序;
2. 什么是初始化列表: 編譯期間, C++讀取初始化列表, 生成一塊靜態(tài)的存儲(chǔ)區(qū)域, 簡(jiǎn)單的說, 作為類的Static成員放置;
new 一個(gè)對(duì)象的時(shí)候, 我們?nèi)绻麍?zhí)行this.m_變量賦值, 顯然要隨機(jī)執(zhí)行內(nèi)存訪問, 這樣不是C++程序員想看到的, (低效, 我要你干啥);
反過來, 如果是初始化列表的執(zhí)行是一個(gè)MemCpy(this, 初始化里表, sizeof());就能帶來性能上的提升;
所以為了使得初始化列表能執(zhí)行高效, C++編譯器先將初始化列表在編譯期寫入到指定的內(nèi)存, 然后構(gòu)造的時(shí)候在MemCpy出來.
MemCpy操作前提是連續(xù)的內(nèi)存, 因此初始化列表嚴(yán)格執(zhí)行"依據(jù)類定義的順序";
3. 子類的構(gòu)造是分成兩部分的:
先構(gòu)造Base, 然后再構(gòu)造(Derive - Base), 考慮到在(Derive - Base)構(gòu)造之前, 要執(zhí)行初始化列表,
而如果Derive企圖初始化Base中的指定成員, 必定會(huì)導(dǎo)致內(nèi)存上的不連續(xù), 從而破壞了MemCpy優(yōu)化.
所以編譯器為了效率不支持"子類初始化列表中初時(shí)化基類成員".