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