当前位置: 首页 > 知识库问答 >
问题:

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

金承嗣
2023-03-14

我想创建一个总是返回零的函数,但这个事实对优化器来说不应该是显而易见的,这样使用该值的后续计算就不会因为“已知的零”状态而发生常量折迭。

int zero() {
  return 0;
}

然而,我需要的东西与LTO和尽可能多的未来聪明的优化工作以及。我考虑过从一个全球性的:

int x;

int zero() {
  return x;
}

...但在我看来,一个足够聪明的编译器可能会注意到x从未被写入,并且仍然决定zero()始终为零。

我考虑过使用volatile,比如:

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

共有1个答案

法子昂
2023-03-14

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

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();
}

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

 类似资料:
  • 我正在编写自己的编程语言,由于各种原因,它编译为C。(其中之一是我对汇编知之甚少)。 我有一个关于编译器(例如GCC或Clang)如何优化从函数返回值的问题。假设我有这样的代码: 我的理解是,您可能希望变量A在从FUNC返回时复制到B(如果A和B是结构,这可能会很昂贵)。编译器会认识到在这种情况下,B可以指向a所在的位置,而不需要拷贝吗? 如果main()看起来像这样:怎么办? 谢谢大家!

  • 问题内容: 我最近开始与React合作,但遇到了一些问题。 目前我有以下代码 这是我的职责。 但是,我只用很小的改动就将同一段代码复制/粘贴了5次以上。我希望将其提取为一个函数,但是我不确定该怎么做。 我应该在哪里放置函数?-在render()方法里面? 我应该从中得到什么?-一个字符串,其中包含html和{}占位符中的变量? 我可以简单地在html中调用它吗? 问题答案: 创建这样的功能: 像这

  • 问题内容: 我觉得有点愚蠢,但它不起作用: 我有如果给定的用户是unicode。如果字符串中包含或,我想打印成功,但是我总是得到的结果。 问题答案: 隐式锚定到字符串的开头。如果要在字符串中搜索可以在字符串中任何位置的子字符串,则需要使用: 输出: 另外,Python Regexes不需要在开头和结尾都有一个。 最后,我添加到该行的末尾,因为我认为这就是您想要的。否则,您会得到类似的信息,但并不太

  • 我有一个返回dict对象的函数,我想利用pandas/numpy在数据帧的每一行上为该函数执行列操作/向量化的能力。函数的输入在dataframe中指定,我希望函数的输出成为现有dataframe上的新列。下面是一个例子。 期望输出: 我读了这个答案,大部分内容都是这样的,但是当函数返回一个dict对象,其中包含所需的列名作为dict中的键时,我不太明白该怎么做。

  • 我在ViewDidLoad函数中有一些代码,它将在调用堆栈的末尾设置一个类变量。我试图重构代码,使其成为一个单独的函数,它将返回值,而不是设置类变量。 由于我缺乏swift知识,我不确定哪里出了问题,我的函数似乎返回得太厄尔了,因为我可以在调试器中告诉我,它在被设置为之前跳转到return。 我还可以在调试器中看到,内部函数在返回主函数后调用。 如何等待内部调用完成后再返回?或者什么是正确的快速方

  • 我试图使一个函数,对于一个整数序列作为一个数组,可以确定是否可以通过从数组中移除不超过一个元素来获得严格递增的序列。如果可以移除某个元素,则输出为True,否则返回false。我试过了, 它适用于列表, 因为你不能删除任何会导致递增序列的数字。但是,如果列表是 这是真的,因为你可以删除2或3有一个递增的序列。但是,我的函数错误地输出False。