c++ - gcc 或 clang 未优化函数指针间接 - 错误或有意?
问题描述
给定以下两个函数:
int f() { return 0; }
int g() { return 1; }
以下代码根据 boolean 调用其中一个b
:
int t0(bool b) { return (b ? &f : &g)(); }
int t1(bool b) { return b ? f() : g(); }
int t2(bool b) { return b ? t0(true) : t0(false); }
两者都g++ (trunk)
未能优化以下代码clang++ (trunk)
:-std=c++2a -Ofast -march=native
int main(int ac, char**) { return t0(ac & 1); }
生成以下组件:
main: and edi, 1 mov eax, OFFSET FLAT:f() mov edx, OFFSET FLAT:g() cmove rax, rdx jmp rax
调用t1
or t2
(而不是t0
)产生以下优化的程序集:
main: mov eax, edi not eax and eax, 1 ret
一切都可以在gcc.godbolt.org上实时复制。
我觉得令人费解的是,t0
直接调用main
并没有得到优化,而调用它t2
是可以的。
t0
调用不产生与 or 相同的程序集t1
是否有原因t2
?还是两者都错过了优化g++ (trunk)
机会clang++ (trunk)
?
解决方案
推荐阅读
- python - 我无法安装scrapy
- sockets - 在本地测试 UDP 广播
- php - 将 XML 解析为值可能不存在的表
- python - 有没有办法从python中的字符串中找到关键字
- c# - Formview Image Control 在模式切换时清除代码设置的 imageURL
- eclipse - Eclipse 给了我无效的参数“候选人是:float atanf(float)”,即使参数是有效的
- javascript - 使用 Jquery 限制带有父 html 选择器的复选框选择
- scipy - 如何使用 SciPy 重用 Jacobian 和 Inverse Hessian 最小化
- html - 如何在引导程序中在我的屏幕上均匀分布五列?
- python - python,linux:如何将整个硬盘驱动器作为一个原始二进制文件打开