3 回答

TA貢獻1860條經驗 獲得超8個贊
考慮一下這段代碼,
int some_int = 100;
while(some_int == 100)
{
//your code
}
當此程序被編譯,編譯器優化的代碼,如果它認為,該方案從來沒有能做出任何試圖改變的價值some_int,所以它可能會傾向于優化while通過更改其循環while(some_int == 100)到的東西,相當于while(true)使執行可能很快(因為while循環中的條件似乎true總是存在)。(如果編譯器未對其進行優化,則它必須some_int在每次迭代中獲取的值并將其與100進行比較,這顯然有點慢。)
但是,有時(對程序的某些部分)進行優化可能是不可取的,因為可能是其他人正在some_int從編譯器不知道的程序外部更改它的值,因為它看不到它。但這就是您設計的方式。在這種情況下,編譯器的優化將無法產生預期的結果!
因此,為了確保獲得理想的結果,您需要以某種方式停止編譯器優化while循環。這就是volatile關鍵字發揮作用的地方。您需要做的就是這個,
volatile int some_int = 100; //note the 'volatile' qualifier now!
換句話說,我將對此解釋如下:
volatile 告訴編譯器,
“嘿,編譯器,我易變,而且,您甚至可以通過一些您甚至不知道的XYZ來更改我。XYZ可以是任何東西。也許是這個星球之外的某個外星人,稱為程序。也許是一些照明,某種形式中斷,火山等都可能使我突變。也許你永遠都不知道誰會改變我!所以,你一無所知,不要再扮演一個全知的神,也不敢觸摸我現在所在的代碼。 ?
好吧,這就是volatile防止編譯器優化代碼的方式。現在在網上搜索以查看一些示例示例。
從C ++標準報價($ 7.1.5.1 / 8)
[..] volatile是實現避免使用對象的積極優化的暗示, 因為對象的值可能會通過實現無法檢測到的方式進行更改。[...]
- 3 回答
- 0 關注
- 474 瀏覽
添加回答
舉報