闡述C++編譯器變量進(jìn)行優(yōu)化說明
在大多數(shù)情況下,把變量緩存在寄存器中是一個(gè)非常有價(jià)值的優(yōu)化方法,如果不用的話很可惜。C++編譯器提供了顯式禁用這種緩存優(yōu)化的機(jī)會(huì)。如果你聲明變量是使用了volatile修飾符,編譯器就不會(huì)把這個(gè)變量緩存在寄存器里——每次訪問都將去存取變量在內(nèi)存中的實(shí)際位置。
防止了C++編譯器對(duì)所修飾的變量進(jìn)行優(yōu)化。主要應(yīng)用于多線程編程。volatile 可以用于修飾原生類型也可用于自定義類型。volatile 雖與const的語義不同但用法類似。
- class Gadget
- {
- public:
- void Foo() volatile{};
- void Bar() const{};
- void Doo(){};
- //private:
- char name_;
- int state_;
- };
若定義一個(gè)對(duì)象為const:const Gadget cGadget; 說明cGadget對(duì)象的成員變量的值不可更改。所以要求該對(duì)象只能調(diào)用接口中的const型的成員函數(shù)。即要求其可調(diào)用的接口不能修改其成員變量的值,該成員函數(shù)必須為const型。即:
- class Gadget
- {
- public:
- void Foo() volatile{};
- void Bar() const{};
- void Doo(){};
- //private:
- char name_;
- int state_;
- };
因?yàn)閏onst型變量要求其可調(diào)用接口為const型,而對(duì)象之間賦值需要調(diào)用其賦值函數(shù),C++編譯器的賦值函數(shù)并非是const型,因此重載成了必然??墒怯袀€(gè)可笑的問題是,const型對(duì)象是要求不能更改成員變量的值,但賦值是為了改變其值。
所以賦值函數(shù)(考貝構(gòu)造函數(shù))不能為變量賦值。只要不在賦值函數(shù)(考貝構(gòu)造函數(shù))里為變量賦值是可以編譯通過的。但這毫無意義,說這個(gè)只是為volatile,因?yàn)関olatile于const操作是一樣的,只是volatile是可以更改成員變量值,所以這里不成問題。
該運(yùn)算符把expression轉(zhuǎn)換為type-id類型,但沒有運(yùn)行時(shí)類型檢查來保證轉(zhuǎn)換的安全性。它主要有如下幾種用法:
①用于類層次結(jié)構(gòu)中基類和子類之間指針或引用的轉(zhuǎn)換。進(jìn)行上行轉(zhuǎn)換(把子類的指針或引用轉(zhuǎn)換成基類表示)是安全的;進(jìn)行下行轉(zhuǎn)換(把基類指針或引用轉(zhuǎn)換成子類表示)時(shí),由于沒有動(dòng)態(tài)類型檢查,所以是不安全的。
②用于基本數(shù)據(jù)類型之間的轉(zhuǎn)換,如把int轉(zhuǎn)換成char,把int轉(zhuǎn)換成enum。這種轉(zhuǎn)換的安全性也要開發(fā)人員來保證。
③把空指針轉(zhuǎn)換成目標(biāo)類型的空指針。#t#
④把任何類型的表達(dá)式轉(zhuǎn)換成void類型。
注意:C++編譯器不能轉(zhuǎn)換掉expression的const、volitale、或者_(dá)_unaligned屬性。
【編輯推薦】