c++ - 为什么 clang++ 和 g++ 不对这些指令进行重复数据删除?
问题描述
考虑以下函数:
std::string get_value(const bool b)
{
if (b) {
return "Hello";
}
else {
return "World";
}
}
g++ 11.0.1 20210312 将此(作为 C++17 并具有最大优化)编译为:
get_value[abi:cxx11](bool):
lea rdx, [rdi+16]
mov rax, rdi
mov QWORD PTR [rdi], rdx
test sil, sil
je .L2
mov DWORD PTR [rdi+16], 1819043144
mov BYTE PTR [rdx+4], 111
mov QWORD PTR [rax+8], 5
mov BYTE PTR [rax+21], 0
ret
.L2:
mov DWORD PTR [rdi+16], 1819438935
mov BYTE PTR [rdx+4], 100
mov QWORD PTR [rax+8], 5
mov BYTE PTR [rax+21], 0
ret
为什么它不会mov
在跳转之前甚至在 之前将两条复制的指令向上移动test
,从而将代码大小减少两条指令?
clang++ 和 libc++ 也会发生同样的事情,除了它只有一条相关指令可以向上移动。
(另请参见GodBolt)
解决方案
推荐阅读
- reactjs - 道具未在商店更改时更新 - Reactjs/Redux
- ios - Swift:preferredStatusBarStyle() 未使用 SSASideMenu 调用
- c# - 递归菜单的顺序错误
- oracle - oracle流水线表功能可以提高普通视图的性能吗
- javascript - 如何使 JS 错误不会阻止 Trix 工作?
- java - Maven-Spring-boot-Eclipse 构建成功,但不安装包(Lombok)
- python - 层 lstm_35 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:[None, 1966, 7059, 256]
- android - Braintree授权指纹无效
- c++ - 如何在没有模板的情况下为变量参数编写 Print 方法?
- agda - 将二元自然覆盖为更高的归纳类型