[英]compiler optimization: move variable from stack to register
這是代碼:
#include <cstring>
#include <cstdint>
#include <cstddef>
uint64_t uint5korr(const std::byte *p)
{
uint64_t result= 0;
std::memcpy(&result, p, 5);
return result;
}
clang在這里優化result
到一個寄存器而gcc沒有。 我懷疑這可能與某個事實有關,因為我不能取一個寄存器的地址。
這只是gcc中缺少的優化,或者clang違反了標准嗎?
是的,這種優化是合法的。 從正確的地址讀取5個字節(不是8個字節); 沒有必要再次存儲它們只是為了return
,地址采取或否。 我同意Michael Kenzel的懷疑,即這已經定義了行為,但這只能鞏固優化的有效性。
不是語言律師的回答。
雖然GCC中似乎缺少優化本身,但使用部分memcpy
ed值IIUC是一種未定義的行為。 我會向GCC提交一個錯誤,以便對該主題做出明確的回應。
通過GCC / Clang / MSVC方式完美優化加載40位寬度整數:
std::uint64_t load_u40(const std::byte *p)
{
std::uint8_t lo = 0;
std::memcpy(&lo, p, 1);
std::uint32_t hi = 0;
std::memcpy(&hi, p + 1, 4);
return (static_cast<std::uint64_t>(hi) << 8) | lo;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.