在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可以防止其消除) 。

09-05 23:58
查看更多