簡體   English   中英

跨 C 和 C++ 標准的可靠類型雙關

[英]Reliable type-punning across C and C++ standards

有沒有一種在 C 和 C++ 中都有效的雙關語? 最好是低開銷,並避免瑣碎的預處理器黑客攻擊。

在 C89 中,我知道我可以這樣做:

unsigned int float_bits(float num) {
    return *(unsigned int *)#
}

然而,這違反了 C99 的嚴格別名規則。 所以像這樣的東西在各種 C 標准中可能更便攜:

unsigned int float_bits(float num) {
    union { float f; unsigned int i; } u;
    u.f = num;
    return u.i;
}

但我知道這不是有效的 C++,因為一次只有一個工會成員可以“活躍”。 C 和 C++ 給出的典型解決方案是這樣的:

unsigned int float_bits(float num) {
    unsigned int i;
    memcpy(&i, &num, sizeof(int));
    return i;
}

但是,這依賴於編譯器能夠優化對 memcpy 的調用。 memcpy 是唯一可跨 C 和 C++ 標准移植的方法嗎?

unsigned int float_bits(float num) {
  unsigned int i;
  memcpy(&i, &num, sizeof(int));
  return i;
}

除了將i更改為與num相同的字節之外,調用memcpy沒有任何副作用。

確實,編譯器可以在這里自由插入對庫memcpy function 的調用。 他們還可以隨意插入100萬個NOOP,一個乒乓模擬AI訓練session,並嘗試尋找Goldblach猜想證明的證明空間。

在某些時候,您必須假設您的編譯器不是敵對的。

每個體面的編譯器都了解 memcpy 的作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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