[英]Has atomic type-punning through unions defined behaviour?
typedef union
{
uint32_t i;
float f;
} MyUnion;
MyUnion u;
u.f = 4.2;
print("%"PRIu32, u.i); // defined behaviour
通過 C 標准中的腳注給出:
如果用於讀取聯合 object 內容的成員與最后用於在 object 中存儲值的成員不同,則該值的 object 表示的適當部分被重新解釋為新類型中的 object 表示在 6.2.6 中描述(有時稱為“類型雙關”的過程)。 這可能是陷阱表示。
但是,當使用原子操作時,它仍然是定義的行為嗎? 那是什么行為? 我們有一些順序保證嗎?
typedef union
{
_Atomic uint32_t i;
_Atomic float f; // assume sizeof(float) == sizeof(uint32_t)
} MyUnion;
int load(MyUnion* p)
{
atomic_load(&p->i);
}
void store(MyUnion* p)
{
return atomic_store(&p->i, 42);
}
您還可以構造奇怪的示例,例如:
typedef union
{
_Atomic uint32_t i;
struct
{
uint16_t h0; // or maybe _Atomic uint16_t ah0;
_Atomic uint16_t ah1;
};
} MyUnion;
6.5.2.3p5 至少說:
訪問原子結構或聯合 object 的成員會導致未定義的行為。
typedef _Atomic union
{
uint32_t i;
float f;
} MyUnion;
int load(MyUnion* p)
{
return atomic_load(&p->i); // UB, also atomic_load on non-atomic type
return p->i; // UB
}
當使用原子操作時,它仍然是定義的行為嗎?
同樣的條件適用。 它可能是陷阱表示,與非限定類型相比, _Atomic
對象可能在大小、表示、alignment 方面有所不同。 如果它不是陷阱表示,那么結果將是(實現)定義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.