首页 > 解决方案 > 编译器优化:将变量从堆栈移动到寄存器

问题描述

这是代码:

#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 以某种方式违反了标准?

标签: c++gccclanglanguage-lawyercompiler-optimization

解决方案


是的,这种优化是合法的。从正确的地址读取 5 个字节(不是 8 个);没有必要再次存储它们,只是为了读取它们的return, 地址是否被占用。我同意 Michael Kenzel 的怀疑,即这已经定义了行为,但这只能巩固优化的有效性。


推荐阅读