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

Alb*_*ert 10 c++ functional-programming c++11

在C++ 98/C++ 03中,语言中没有纯/ const函数关键字.

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

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

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

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

关于它有任何公开的建议吗?

ybu*_*ill 8

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

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

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

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

关于它有任何公开的建议吗?

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


def*_*ode 6

gcc用于__attribute__(( <attr> ))定义函数的额外属性.

  • 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