簡體   English   中英

編譯器優化:將變量從堆棧移動到寄存器

[英]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;
}

https://godbolt.org/z/vULPAZ

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;
}

https://godbolt.org/z/4Kk9IM

暫無
暫無

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

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