C ++ 0x中的pure / const函数

时间:2010-09-26 21:25:40

标签: c++ c++11 functional-programming

在C ++ 98 / C ++ 03中,语言中没有pure/const function keywords

  1. 这在C ++ 0x中发生了变化吗?

  2. 如果是这样,是否可以在功能对象(std::function)上设置这样的标志?所以我可以传递一些函数指针或lambda函数,并另外给出它是纯/ const函数的信息吗?被调用的函数可能具有这种函数的优化执行路径。

  3. 有没有办法检查给定的函数是否为纯/ const?即例如,如果如上所述在std::function上有这样的标志,我可能只是检查那个标志。但也许甚至有更普遍的方式。

  4. 如果没有改变,为什么不呢?我认为获得这样的支持可能非常有用。

    有没有关于它的公开提案?

2 个答案:

答案 0 :(得分:8)

  
      
  1. 这在C ++ 0x中有变化吗?
  2.   

没有。有constexpr但它意味着编译时间常数。如果它的参数也是constexprs那么它在编译时执行,否则它是一个常规函数。由于它们必须在相同的转换单元中定义并且由单个返回语句组成,因此它们可能将被内联并且将执行上述优化。它不能用于提供有关外部链接函数的编译器信息。

  

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

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

  

有没有关于它的公开提案?

我没有看到关于该主题的任何委员会文件。

答案 1 :(得分:6)

gcc使用__attribute__(( <attr> ))在函数上定义extra attributes

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

  • const :不要与C ++ const混淆,const函数只访问参数,那些参数不能是指针。它基本上是pure的限制版本。优化程序会将const函数视为与pure相同的函数。虽然理论上它可以执行比pure更积极(非本地)的记忆化。

C ++ 11的新属性语法(第7.6节)旨在实现这一点。目前,您不能使用C ++的属性语法来设置GCC属性,但这将在未来的gcc版本中发生变化。

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

对于好奇,这里是标准属性列表:

  • 对准
  • 不返回的
  • <击>倍率
  • <击>隐藏
  • <击> base_check
  • carries_dependency