c - 为什么三元没有像if一样编译成同一个程序集?
问题描述
我有两个文件:
int PolyMod(int s);
void CreateChecksum(int isTestNet, int *mod) {
*mod = PolyMod(isTestNet == 0 ? 5 : 9);
}
和
int PolyMod(int s);
void CreateChecksum(int isTestNet, int *mod) {
if (isTestNet == 0) {
*mod = PolyMod(5);
} else {
*mod = PolyMod(9);
}
}
不知何故,他们的组装结果是不同的。为什么?您可以看到从这里的第一个文件和这里的第二个文件创建的程序集。
难道编译器不知道它们是等价的,而且一个更快吗?他们有不同的程序集的原因是它们的速度完全一样,它们之间的唯一区别是操作顺序吗?
我想知道差异是否是由静态分支预测引起的。实验后__builtin_expect
,我相信答案是否定的。
解决方案
看来问题是由 GCC 中的 GIMPLE 引起的错过的优化错误。Clang 没有这个错误,因此它会生成相同的程序集。
我已将此情况报告给 GCC;可以在此处跟踪该错误:https ://gcc.gnu.org/bugzilla/show_bug.cgi?id=85971
推荐阅读
- asp.net-mvc - MVC 完整日历不显示事件
- python - 来自变量的列表名称
- java - 如何在构建期间自动测试是否应用了混淆器
- html - 当鼠标悬停在 html/CSS/angular/bootstrap 中时,显示完整的长文本行(嵌套的 HTML 列表)
- javascript - 使用 *ngFor 时如何仅将类设置为特定元素?
- linux - Build-Essential:在 WSL 上找不到命令
- java - 使用 Java SDK 列出 AWS S3 中的所有对象
- mysql - 使每个外键的 mySQL 列唯一
- android - 添加可点击的图章注释 PSPDFKit
- powershell - docker 通过 PowerShell 远程连接到 windowsservercore