创建一个始终返回零的函数,但优化器不知道?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (33)

我想创建一个始终返回零的函数,但这个事实对于优化器来说不应该是显而易见的,因此使用该值的后续计算将不会因“已知零”状态而不断折叠。

在没有链接时优化的情况下,这通常就像将它放在自己的编译单元中一样简单:

int zero() {
  return 0;
}

优化器无法跨单元查看,因此不会发现此函数的始终为零的特性。

但是,我需要一些适用于LTO的东西,以及未来可能的许多聪明的优化。我考虑从全球阅读:

int x;

int zero() {
  return x;
}

我考虑使用a volatile,如:

int zero() {
  volatile int x = 0;
  return x;
}

.但是,挥发性读取所需副作用的实际语义并不完全清楚,并且似乎不会排除函数仍返回零的可能性。

提问于
用户回答回答于

在clang和gcc上,重击变量是有效的,但会增加一些开销。

int zero()
{
    int i = 0;
    asm volatile(""::"g"(&i):"memory");
    return i;
}

在gcc上的O3下编译为

    mov     DWORD PTR [rsp-4], 0
    lea     rax, [rsp-4]
    mov     eax, DWORD PTR [rsp-4]
    ret
    mov     dword ptr [rsp - 12], 0
    lea     rax, [rsp - 12]
    mov     qword ptr [rsp - 8], rax
    mov     eax, dword ptr [rsp - 12]
    ret
用户回答回答于

如果编译器能搞清楚这一点,我会很惊讶的:

int not_a_zero_honest_guv()
{
    // static makes sure the initialization code only gets called once
    static int const i = std::ifstream("") ? 1:0;
    return i;
}

int main()
{
    std::cout << not_a_zero_honest_guv();
}

这使用函数本地静态的复杂(不可预测)运行时初始化。如果小编译器发现一个空的文件名总是会失败,那么就在里面放一些非法的文件名。

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    7 粉丝1 提问12 回答
  • 四无君

    0 粉丝0 提问3 回答
  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问2 回答
  • o o

    1 粉丝490 提问2 回答

扫码关注云+社区

领取腾讯云代金券