1簡介:
空基類優(yōu)化,即當(dāng)存在空的基類子對(duì)象時(shí),可以將其默認(rèn)規(guī)定的占位字節(jié)忽略
2使用環(huán)境和注意點(diǎn):
(2.1)
空基類優(yōu)化是由于,對(duì)于一個(gè)空類對(duì)象而言,為了保證其地址的唯一性,所以其大小必大于等于1以保證占據(jù)相應(yīng)的地址,但是對(duì)于基類而言,特別是,對(duì)于C++中的standard layout(在這里)由于要保證標(biāo)準(zhǔn)導(dǎo)出,并且可以直接通過reinterpret_cast轉(zhuǎn)型為其第一個(gè)非靜態(tài)數(shù)據(jù)成員,又由于其特性,導(dǎo)致其基類必為不含非靜態(tài)數(shù)據(jù)成員(即為空),從而必須要求使用空基類優(yōu)化
(2.2)
優(yōu)化的條件即為,基類為空,且基類不存在vtp而且其派生類的第一個(gè)非靜態(tài)數(shù)據(jù)成員不為當(dāng)前繼承的空基類,那么就會(huì)發(fā)生優(yōu)化
(2.3)
注意,優(yōu)化僅發(fā)生在以上條件,在其他位置(非第一個(gè)非靜態(tài)成員),存在空基類數(shù)據(jù)成員時(shí),不發(fā)生優(yōu)化,遵循唯一地址和內(nèi)存對(duì)齊規(guī)定
(2.4)
在C++20起存在屬性no_unique_address即不使用地址位置,那么此時(shí)不管空類對(duì)象在那個(gè)位置,都將被優(yōu)化掉.
例子:
#include<iostream>
class Base{
constexpr static int i = 4;
};
class C1:Base{
int i = 0;
};
class C2{
int i = 0;
Base foo;
//C++20 可以使用[[no-unique_address]]Base foo; 此時(shí),sizeof 就為4.
};
class C3:Base{
Base foo;
int i = 0;
};
int main(){
using std::cout;
cout<< sizeof(Base)<<" "<<sizeof(C1)<<" "<<sizeof(C2)<<" "<<sizeof(C3)<<std::endl;
return 0;
}