在c ++的上下文中。
我不知道这之间有什么区别:
T f(T const val);
还有这个:
T f(T const & val);
我确实知道一个值传递,但是,从编译器的角度来看,这是一个不会改变的值,所以我的问题是:
在传递const value参数的情况下,仍然需要编译器进行复制吗?
哪一个对编译器的优化程序更好,为什么?
最佳答案
范例1:
T f(T const val);
如果编译器无法内联(或做一些其他工作来修改函数
f
),则它必须复制T
并将其传递给f
。从调用代码的角度来看,const
没什么区别,仅在函数f
内部。范例2:
T f(T const & val);
编译器将
val
的地址传递给函数,因此不需要进行复制。但是,对小/简单类型使用引用将导致额外的开销,因为参数作为元素的地址传递,并且
f
的内容将必须进行额外的操作来加载地址,然后加载的实际内容。 val
。因此,确定“哪个副本最有效”的问题是“复制T
有多复杂,函数f
使用val
有多复杂”。始终,如果您想获得更好的性能,请衡量结果!最后,如果编译器能够内联代码,则很可能消除对象的所有副本(假定构造函数是已知的,并且不能阻止其消除-例如,向该构造函数添加I / O可以防止其消除) 。