Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的纯/常量函数+;0x_C++_C++11_Functional Programming - Fatal编程技术网

C++ C+中的纯/常量函数+;0x

C++ C+中的纯/常量函数+;0x,c++,c++11,functional-programming,C++,C++11,Functional Programming,在C++98/C++03中,该语言中没有 这在C++0x中发生了变化吗 如果是这样,是否可以在函数对象(std::function)上设置这样的标志?所以我可以传递一些函数指针或lambda函数,并提供额外的信息,说明它是纯/const函数?被调用函数可以具有用于此类函数的优化执行路径 是否有某种方法可以检查给定函数是否为纯/常量?例如,如果如上所述,std::function上有这样的标志,我可能只需要检查该标志。但也许还有更一般的方法 如果没有改变,为什么没有?我认为得到这样的支持可能非常有

在C++98/C++03中,该语言中没有

  • 这在C++0x中发生了变化吗

  • 如果是这样,是否可以在函数对象(
    std::function
    )上设置这样的标志?所以我可以传递一些函数指针或lambda函数,并提供额外的信息,说明它是纯/const函数?被调用函数可以具有用于此类函数的优化执行路径

  • 是否有某种方法可以检查给定函数是否为纯/常量?例如,如果如上所述,
    std::function
    上有这样的标志,我可能只需要检查该标志。但也许还有更一般的方法

  • 如果没有改变,为什么没有?我认为得到这样的支持可能非常有用

    有什么公开的建议吗

  • 这在C++0x中发生了变化吗
  • 不是。有一个
    constexpr
    ,但它表示编译时常数。如果它的参数也是
    constexprs
    ,那么它将在编译时执行,否则它将是一个常规函数。因为它们必须在同一个翻译单元中定义,并且由一个返回语句组成,所以它们可能是内联的,并且将执行上述优化。它不能用于提供有关外部链接函数的编译器信息

    如果没有改变,为什么没有?我认为得到这样的支持可能非常有用

    事实上我认为你不需要它。语言已经太大了,程序员可以根据自己的知识轻松地重写代码,以提高效率。与
    restrict
    不同,它不提供任何无法通过其他方式表达的信息

    有什么公开的建议吗


    我还没有看到任何关于这个主题的委员会论文。

    gcc使用
    \uuuuuu属性(关于函数)

    • pure:仅访问(但不修改)参数和全局内存。GCC使用此信息确定优化器是否可以完全忽略对函数的重复调用(本地记忆)。两个值得注意的pure函数是
      strlen
      memcmp

    • <> >强> > const :不与C++ const混淆,const函数只访问参数,这些参数不一定是指针。它基本上是一个更严格的版本<代码>纯< /C> >优化器对待<代码> const 函数,与<代码>纯< /C> >相同。(非本地)比
      更容易记忆

    C++11的新属性语法(§7.6)就是为了做这类事情而设计的。目前,您不能使用C++的属性语法来设置GCC属性,但这将在未来的GCC版本中发生变化

    因此,您可以使用属性语法将
    pure
    属性分配给函数。但是没有标准的
    pure
    属性。pure将是特定于编译器的,但它在gcc上会做正确的事情

    出于好奇,以下是标准属性列表:

    • 对齐
    • 诺雷图恩
    • 凌驾
    • 隐藏
    • 基础检查
    • 具有依赖性

    • 谢谢你提供的信息。但是,纯/ const确实会提供更多的信息,在某些情况下,它可以非常复杂/几乎不可能表达。编译器甚至可以透明地添加记忆。@艾伯特:自动记忆化不太可能发生在C++中。
      std::function
      ,可能可以创建
      my\u memorized\u function
      。@Albert:但是你可以自己实现memorization,所以再次强调,没有什么是不能用其他方式表达的。@Albert:顺便说一句,如果编译器确实有你函数的定义,那么它很容易看出它没有副作用nd自动将其标记为“纯”。但我不知道有哪种编译器可以进行这种优化。请注意,“纯”不引入新的语义-它不会改变程序的行为。委员会添加了一个标准化的属性语法,可用于不影响行为的编译器功能。因此,我们可以期望编译器通过此语法实现限制和纯。@jalf:这不是编译器优化的重点。point关于编译器优化是指编译器是否有机会自己进行优化。在不知道函数是纯函数还是常量的情况下,根本不可能进行优化。(因此,记忆化可能是一件非常极端的事情,我不知道现在是否有编译器在这样做。)是否仍然存在“覆盖”属性,即使现在C++11有一个显式的
      override
      关键字?
      override
      base\u check
      ,和
      hidden
      也被卷到了` override关键字'中。我正在尝试清理标签-以获取更多信息。我不知道太多,所以我可以就这个问题和类似问题使用的其他标签征求您的意见吗它,关于
      pure/const