首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11中的纯函数

C++11中的纯函数
EN

Stack Overflow用户
提问于 2012-12-03 06:46:07
回答 2查看 5.9K关注 0票数 9

C++11中的函数(不是类方法)是否可以在gcc中以某种方式标记为const,以告知它是,并且不使用全局内存,而只使用其参数?

我试过gcc__attribute__((const)),它是我想要的,但当函数中的全局内存被触及时,它不会产生任何编译时错误。

编辑1个

,请小心,。我的意思是纯函数。不是常量函数。GCC的属性有点让人迷惑。纯函数只使用它们的参数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-03 07:01:17

你在找constexpr吗?这告诉编译器可以在编译时计算函数。constexpr函数必须具有文本返回和参数类型,并且主体只能包含静态断言、类型定义、使用声明和指令以及一条返回语句。可以在常量表达式中调用constexpr函数。

代码语言:javascript
复制
constexpr int add(int a, int b) { return a + b; }

int x[add(3, 6)];

看过__atribute__((const))的含义后,答案是否定的,你不能用标准的C++做到这一点。使用constexpr将达到相同的效果,但仅限于更有限的一组函数。但是,只要编译后的程序以相同的方式运行( as-if规则),就没有什么能阻止编译器自己进行这些优化。

票数 7
EN

Stack Overflow用户

发布于 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++编译器实际上是因为函数的纯洁性,它们只是不能保证捕获所有的情况。

我发现这个功能的优先级似乎很低,这是令人遗憾的。它使得对代码的推理变得非常容易。我甚至认为,它将通过激励程序员以不同的方式思考来改进软件设计。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13674767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档