簡體   English   中英

是否通過聯合定義了行為的原子類型雙關語?

[英]Has atomic type-punning through unions defined behaviour?

通過聯合進行類型雙關已在 C 中定義了行為

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.

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