[英]Volatile semantics in C99
我遇到了一些我正在編寫的低級代碼的問題,我需要將對象用作volatile,但不一定是因為我希望將類型聲明為volatile(出於可重用性的原因)。 但是,我可以定義指向結構的限定變體的指針,如以下段中所述。
struct x {
int bar;
};
struct x foobar;
...
volatile struct x *foo = &foobar;
現在foo實際上是指向該類型對象的指針:
volatile struct x {
volatile int x;
};
因為volatile適用於所有struct成員。 現在我的問題是當一個對象包含指向另一個對象的指針時,如何應用波動性?
struct x {
struct y *bar;
};
指向x的volatile實例的指針然后將其視為:
volatile struct x {
struct y * volatile bar;
};
或作為:
volatile struct x {
volatile struct y * volatile bar;
};
我已經閱讀了C標准,對此並不是很清楚,我可以通過多種方式輕松解釋這些措辭。
在你的例子中,你得到一個易失性指針,就是這樣,波動性不會擴展到對象。
擴展我的答案volatile是一個輕松的原子,這意味着訪問是原子的,但指令不會。 因此,您無法線程安全地增加或減少volatile,因此您不能使用volatile指針進行交互,只能使用store / load(assigment)操作。 對於int或其他數字也是如此,volatile也不能用於浮點數,因為它們是在FPU管道中處理的,而不是CPU。 總而言之,volatile並不太有用,但微軟的編譯器會自動將指令保護在揮發物周圍,使其成為真正的原子價值,但這不是標准的一部分。
通過這里的標准閱讀,似乎指針是易變的,但不是結構本身的實際內容。 我從給出的例子中解釋了const t * volatile p
(在鏈接的底部)。 然而,措辭含糊不清,但我認為這是一個類似的例子:
struct foo {
int bar;
};
struct foo *volatile x;
請注意,我沒有嘗試過這個,所以我可能會非常不正確...這只是我從粗略的標准閱讀中收集的內容。
此外,cdecl確實清除了一些模糊性。 例如:
cdecl>解釋
volatile struct x* foo
將foo聲明為volatile x的指針
鑒於:
cdecl>解釋
struct x* volatile foo
將foo聲明為struct x的volatile指針
在一個實例中,結構是易失性的。 在另一個,指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.