C++标准给予优化权生成代码表示程序操作

本文详细探讨了C++中副作用的概念及其对程序状态的影响。解释了副作用如何在表达式求值过程中修改程序状态或执行输入/输出操作。此外,文章还讨论了副作用与序列点的关系,以及它们如何影响函数调用时参数的评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是另一种解释的副作用补充的解释,我已经提到了迄今:
什么是'副作用'在C++?它是一个标准的术语,是定义良好?
C++ 11草案1.9.12:访问的挥发性glvalue指定对象(3.10),修改一个对象,调用I/O库函数,或者调用一个函数,这些操作都是没有任何副作用,这是在执行环境状态的变化。一个表达式求值(或子表达式)一般包括价值计算(包括确定为glvalue评价对象身份的取值以前分配给prvalue评价对象)和引发的副作用。当调用一个库的I / O函数返回或访问一个易挥发的对象被评估的副作用被认为是完整的,即使一些外部动作所暗示的调用(如I / O本身)或由不易挥发的访问可能还没有完成。
“副作用”的意义是什么?
的意义在于,作为表达式被求值可以修改程序状态和/或执行I / O表达式在C++中无数的地方允许变量赋值,如果/其他/当条件,循环设置/测试/修改步骤,函数参数等…几个例子:+ + X和strcat(缓冲区,“附加”)。
一个C++程序,标准给予优化权生成代码表示程序操作,但要求所有在序列点出现在任何顺序点后的相关操作步骤相关的操作步骤。
因为C++程序员倾向于关心序列点副作用是,没有许多序列点如你所期望的。例如,给出



x = 1;
(+ + X,+ +);
你可能会期望一个电话到F(2,3),但它实际上是不确定的行为。这种行为是未定义的编译器的优化已经安排手术的副作用,运行在最高效的订单可能甚至是平行的更自由。这也避免加重编译器作者检测条件。
1。逗号操作符没有副作用吗?
是的-一个逗号操作符引入了一个序列点:左边的步骤必须在右边的执行之前完成。有http://en.wikipedia.org/wiki/sequence_point -目录序列点你应该读这!(如果你要问关于副作用,然后小心解释这样的回答——“逗号”不会被调用函数的参数数组初始化元素之间,等。逗号运算符是比较少用的,有些模糊的。
2。副作用当对象传递给函数的C++
当调用一个函数时,所有的参数都必须被完全的评估,并且它们的副作用在函数调用发生之前就被触发了。但是,没有任何限制的编译器相关的评估特定的参数表达式之前,任何其他。它们可以是重叠的,在平行的等。所以,在F(expr1,expr2)的一些评价可能跑过任何expr1 expr2的步骤,但仍有可能完成第一值是未定义的。
/ /一个更多的解释:
“副作用”一词源于命令式语言和纯函数式语言的区别。一个C++表达式可以做的三件事:
1。计算结果(或在无效表达式的情况下计算“没有结果”),
2。提高一个例外而不是对结果的评价,
三.除了1或2,否则改变了程序在名义上运行的抽象机器的状态。
(3)是副作用,“主要作用”是对表达结果的评价。异常是一个稍微棘手的特殊情况,在改变控制的流程确实改变了抽象机器的状态(通过改变当前的执行点),但不是一个副作用。构建、处理和销毁异常的代码可能有它自己的副作用,当然。
同样的原则适用于函数,表达式的返回值代替了表达式的结果。
所以,




int foo(int,int b)
{
返回一个+ B;
}
只要计算一个返回值,它不会改变任何其他东西。因此它没有副作用,它有时是一个函数的一个有趣的属性,当它涉及到你的程序的推理(例如,证明它是正确的,或由编译器优化时)。
以下功能:




int酒吧(int&,int & B)
{
返回+ + + B;
}
确实有副作用,因为修改调用方的对象“A”是超出简单计算返回值的函数的附加效果。它不会被允许在一个纯粹的功能性语言。

亚历克斯,你的一个副作用的定义是:“一个副作用是一个运算符,表达式,语句或函数的结果,即使在运算符,表达式,状态。


我刚刚结束了第4.6节和我爱的教程,但我错过了什么吗?或者我不应该知道这意味着什么呢?我想我唯一跳过了这个点位运算符。我知道标准名称空间站的标准名称。乍一看,向量和双都看起来像std::string函数,int是函数的参数配对。
如果这是不久后覆盖,我想只是指向我的教训,否则我会遇到它比以后更快。否则,如果它被覆盖在此之前的教训,请刷新我的记忆,因为我没有看到正是我认为我应该在那一刻。
编辑:进一步阅读后,现在看来,我认为向量和对只是在标准名称空间中的类型,但我想我仍然困惑括号和他们的意思是,在连接他们所有。任何帮助将不胜感激,感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值