假设我有一个函数,其中参数是通过值传递的,而不是const-reference。此外,让我们假设只在函数内部使用该值,即该函数不会尝试修改它。在这种情况下,编译器将能够计算出它可以通过const-reference传递值(出于性能原因)并相应地生成代码吗?有没有能做到这一点的编译器?
发布于 2010-03-16 00:05:05
如果你传递一个变量而不是临时变量,如果它的拷贝构造函数做了你在运行程序时会注意到的任何事情(“可观察的行为”:输入/输出,或者改变易失性变量),编译器就不能优化掉拷贝。
除此之外,编译器可以自由地做它想做的任何事情(它只需要类似于可观察到的行为-如果它根本没有优化的话)。
只有当参数是右值(大多数是临时性的)时,即使复制构造函数有可观察到的副作用,编译器也可以将复制优化为按值参数。
发布于 2010-03-16 00:01:08
只有当函数没有导出时,编译器才有机会将按引用调用转换为按值调用(反之亦然)。
否则,由于调用约定,函数必须保持按值调用/引用语义。
发布于 2010-03-16 00:09:49
我不知道是否有任何一般的保证可以做到这一点,但如果调用的函数是内联的,那么这将允许编译器看到正在进行不必要的复制,如果优化级别足够高,复制操作将被消除。至少,GCC可以做到这一点。
您可能需要考虑此参数值的类是否具有复制构造函数。如果没有,那么按值传递和按常量引用传递之间的性能差异可能是不可忽视的。
另一方面,如果类确实有一个执行任务的复制构造函数,那么您所希望的优化可能不会发生,因为编译器不能删除对构造函数的调用--它不知道构造函数的副作用对您不重要。
如果你说出参数的类是什么,或者如果它是一个自定义类,描述它有哪些字段以及它是否有一个复制构造函数,你可能会得到更有用的答案。
https://stackoverflow.com/questions/2448501
复制相似问题