簡體   English   中英

C99中的易失性語義

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM