※ 引述《windows2k (程式宅 <囧>)》之銘言:
: 不過中間有句話不太明瞭
: The C standard states that accesses to volatile objects are part of the
: unalterable observable behaviour — but it says nothing about accesses via
: lvalue expressions with volatile types. Consequently a sufficiently
: intelligent compiler can still optimize the buffer-zeroing away in this case
: — it just has to prove that the object being accessed was not originally
: defined as being volatile.
我講一下我對這段話套用在這個 memset 例子的字面理解..
這個 memset 裡面把指標宣告為指向 volatile 的指標,
用這個指標來存取東西的時候是這一段文字裡面說的
「via lvalue expression with volatile types」
強調它是 volatile types 是因為我們是從這個指標來判斷的,
而不是這一塊被指的記憶體本身來看的.
這個 volatile 指標可能指向 volatile 記憶體, 也可能指向 non-volatile 記憶體,
這段話最前面說的
「access to volatile objects」
指的是一塊記憶體本身被標為 volatile.
所以, 他說這個 memset 有效, 是因為 compiler 還不夠聰明,
還沒辦法直接看出背後指到的記憶體是什麼, 所以就先用指標的型態判斷了,
但萬一有一天 compiler 覺醒了, 發現你只是用指標在騙他,
他看穿你的把戲以後可能就會怒把它 optimize 掉.. XD