C++11中的函数(不是类方法)是否可以在gcc中以某种方式标记为const,以告知它是纯,并且不使用全局内存,而只使用其参数?
我试过gcc的__attribute__((const)),它是我想要的,但当函数中的全局内存被触及时,它不会产生任何编译时错误。
编辑1个
,请小心,。我的意思是纯函数。不是常量函数。GCC的属性有点让人迷惑。纯函数只使用它们的参数。
发布于 2012-12-03 07:01:17
你在找constexpr吗?这告诉编译器可以在编译时计算函数。constexpr函数必须具有文本返回和参数类型,并且主体只能包含静态断言、类型定义、使用声明和指令以及一条返回语句。可以在常量表达式中调用constexpr函数。
constexpr int add(int a, int b) { return a + b; }
int x[add(3, 6)];看过__atribute__((const))的含义后,答案是否定的,你不能用标准的C++做到这一点。使用constexpr将达到相同的效果,但仅限于更有限的一组函数。但是,只要编译后的程序以相同的方式运行( as-if规则),就没有什么能阻止编译器自己进行这些优化。
发布于 2018-03-18 23:07:13
因为这里已经提到了很多,让我们暂时忘掉元编程,因为它是纯函数式的,而且离题。然而, foo 的常量表达式函数可以使用非常量表达式参数来调用,在此上下文中, foo 实际上是在运行时<代码>E29时计算的纯函数(这里我忽略全局变量)。但是你可以编写许多纯函数,但你不能使其成为常量表达式,这包括任何抛出异常的函数。
其次,我假设OP意味着将pure标记为供编译器检查的断言。GCC的纯属性正好相反,它是编码器帮助编译器的一种方式。
尽管OP的问题的答案是否定的,但阅读有关尝试引入纯关键字(或不纯并让pure作为缺省关键字)的历史是非常有趣的。
d-lang社区很快就发现“纯”的含义并不明确。日志记录不应该使函数变得不纯。在纯函数中应该允许不转义函数调用的可变变量。具有不同地址的相等返回值不应被视为不纯。但D在拉伸纯度方面走得更远。
因此,d-lang社区引入了“弱纯”和“强纯”两个术语。但后来的争论表明,弱者和强者并不是黑白分明的,而且存在灰色地带。请参阅purity in D
Rust很早就引入了"pure“关键字;但由于它的复杂性,他们放弃了它。参见purity in Rust。
在“纯”关键字的巨大好处中,有一个丑陋的后果。模板化函数可以是纯函数,也可以不是纯函数,这取决于其类型参数。这可能会导致模板实例化的数量激增。这些实例化可能只需要暂时存在于编译器中,而不是进入可执行文件中,但它们仍然可以极大地缩短编译时间。
语法突出显示编辑器在这里可能会有一些帮助,而不需要修改语言。优化C++编译器实际上是因为函数的纯洁性,它们只是不能保证捕获所有的情况。
我发现这个功能的优先级似乎很低,这是令人遗憾的。它使得对代码的推理变得非常容易。我甚至认为,它将通过激励程序员以不同的方式思考来改进软件设计。
https://stackoverflow.com/questions/13674767
复制相似问题