c++ - 编译器优化:将变量从堆栈移动到寄存器
问题描述
这是代码:
#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 的怀疑,即这已经定义了行为,但这只能巩固优化的有效性。
推荐阅读
- flutter - 如何使用 Flutter 实现这一点?
- gcc - 运行 rhel6 构建的可执行文件时在 rhel7 机器上导入错误
- asp.net - 如果 nuget 包支持 .Net Standard 2.0,那么我们可以在 asp.net 和 asp.net 核心中使用该包吗?
- jenkins-pipeline - 如何使用 Jenkins 中的 ssh 发布将环境变量传递给远程主机
- java - AuthorizationCodeInstalledApp,意外行为
- amazon-web-services - 您可以将文件设置为隐藏在 S3 存储桶中吗?
- r - 我使用 GROUPBY 然后 SUMMARIZE 将总标签添加到数据框。但是意味着总水平的百分比数据是错误的
- java - 从 Java 8 迁移到 Java 11 时无法解析 java.time.format.DateTimeParseException
- javascript - 如何使用reduce方法映射对象?
- python - 在 react app 调用的烧瓶 api 中使用 Sqlite 和 sqlalchemy 的线程和递归问题