c++ - 别名 - clang 优化器害怕什么?

标签 c++ clang llvm compiler-optimization

拿这个玩具代码(godbolt link):

int somefunc(const int&);
void nothing();

int f(int i) {
    i = somefunc(i);
    i++;
    nothing();
    i++;
    nothing();
    i++;
    return i;
}

从链接的反汇编中可以看出,编译器从堆栈中重新加载 i 3 次,递增并存储回去。

如果 somefunc 被修改为按值接受 intthis doesn't happen .

(1) 优化器是否“害怕”因为 somefunc 可以访问 i 的地址,所以它可以间接修改它?你能举一个定义明确的代码的例子吗? (请记住,const_cast 的退出和修改是未定义的行为)。

(2) 即使那是真的,我希望用 __attribute__((pure)) 装饰 somefunc 会停止这种悲观情绪。 It doesn't .为什么?

这些 llvm 是否遗漏了优化?


编辑:如果 somefunc 返回 void,__attribute__((pure)) 会按预期启动:

void somefunc(const int&) __attribute__((pure));
void nothing();

int f(int i) {
    somefunc(i);
    i++;
    nothing();
    i++;
    nothing();
    i++;
    return i;
}

也许这个属性有点不成熟(在实践中很少见)。

最佳答案

如评论中所述,使用 const_cast 删除对定义为非常量的对象的引用的常量性是明确定义的。事实上,这是它唯一的真正用途。

至于 __attribute__((pure)):谁知道呢。 nothing() 调用对于重现这种情况是必要的;如果那些被标记为 pure 那么适当的优化就完成了; somefunc 的调用对这种情况没有太大影响。基本上,除非代码块中的一切 都是纯的,否则编译器往往会非常保守。虽然可以说它应该能够推断出 nothing() 不会影响 i,但这是一个非常“尽力而为”的优化领域,而不是正确优化代码的地方应该靠。

关于c++ - 别名 - clang 优化器害怕什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70644411/

相关文章:

C++ String to double atof 转换丢失精度?

macos - 如何使用 LLVM 在 MacOS 上构建 ELF?

c++ - 我应该下载哪个 Clang 编译器?

llvm - `LLVM ERROR: Target does not support MC emission!` 的原因是什么?

c++ - C++ 中的 C 库

c++ - C++中vector是如何实现的

c - 用内联汇编 C 替换函数

c++ - llvm 以 char * 作为参数调用外部函数

ios - "Bad system call: 12"在带有 IPA 部署的 iOS 上使用静态框架时崩溃(不是 Xcode 运行)

C++ clock() 只返回零