首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器是否会优化通过值传递的函数参数?

编译器是否会优化通过值传递的函数参数?
EN

Stack Overflow用户
提问于 2010-03-15 23:57:10
回答 5查看 3.9K关注 0票数 19

假设我有一个函数,其中参数是通过值传递的,而不是const-reference。此外,让我们假设只在函数内部使用该值,即该函数不会尝试修改它。在这种情况下,编译器将能够计算出它可以通过const-reference传递值(出于性能原因)并相应地生成代码吗?有没有能做到这一点的编译器?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-16 00:05:05

如果你传递一个变量而不是临时变量,如果它的拷贝构造函数做了你在运行程序时会注意到的任何事情(“可观察的行为”:输入/输出,或者改变易失性变量),编译器就不能优化掉拷贝。

除此之外,编译器可以自由地做它想做的任何事情(它只需要类似于可观察到的行为-如果它根本没有优化的话)。

只有当参数是右值(大多数是临时性的)时,即使复制构造函数有可观察到的副作用,编译器也可以将复制优化为按值参数。

票数 15
EN

Stack Overflow用户

发布于 2010-03-16 00:01:08

只有当函数没有导出时,编译器才有机会将按引用调用转换为按值调用(反之亦然)。

否则,由于调用约定,函数必须保持按值调用/引用语义。

票数 7
EN

Stack Overflow用户

发布于 2010-03-16 00:09:49

我不知道是否有任何一般的保证可以做到这一点,但如果调用的函数是内联的,那么这将允许编译器看到正在进行不必要的复制,如果优化级别足够高,复制操作将被消除。至少,GCC可以做到这一点。

您可能需要考虑此参数值的类是否具有复制构造函数。如果没有,那么按值传递和按常量引用传递之间的性能差异可能是不可忽视的。

另一方面,如果类确实有一个执行任务的复制构造函数,那么您所希望的优化可能不会发生,因为编译器不能删除对构造函数的调用--它不知道构造函数的副作用对您不重要。

如果你说出参数的类是什么,或者如果它是一个自定义类,描述它有哪些字段以及它是否有一个复制构造函数,你可能会得到更有用的答案。

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

https://stackoverflow.com/questions/2448501

复制
相关文章

相似问题

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