|
|
1
3
对于基元类型,只需按值返回。没有理由通过常量引用返回原语。 对于非基元类型,这取决于。 如果返回的值是函数的局部变量,则必须按值返回。否则,在调用方使用返回的引用之前,变量将被销毁。 如果返回的值是类数据成员,则可以选择。 按常量引用返回可避免复制,这可能是性能优势。但是,它将接口绑定到实现,即数据成员和返回值必须是同一类型。它也不太安全,因为调用方可以保留比对象生存期更长的引用,例如:
按值返回会产生一个或两个副本,这取决于您是否可以利用返回值优化(这可能适用于类似这样的简单get()方法)。此外,使用默认复制构造函数的对象副本可以更有效地复制(想想:编译器可以简单地存储数据)。 建议:从return by value开始,在确定调用/副本是已知的性能问题之后,才切换到return by const引用。 最后,另一种选择是按参数返回,这对于更复杂的对象(例如字符串)很有用:
或:
|
|
|
2
0
如果需要返回值,则必须返回值-const引用不是可接受的替换。但我怀疑你是在问这样的事情:
我从来没有想出一个万无一失的指导方针。 |
|
|
3
0
类中可能有一个类似于资源的元素容器,并且
返回资源的新副本
|
|
|
4
0
这完全取决于你到底想做什么。 如果要返回对要由用户代码使用的对象的引用,则:
如果要以只读方式返回对对象的引用,并且只允许访问此对象类型的常量函数,则:
如果要返回对要由用户代码使用的对象的引用,即使类实例以只读方式(const)使用,则:
如果您不想以只读方式返回对对象的引用,只允许访问此对象类型的const函数,并且如果类实例以只读方式使用(作为const),则:
只需添加一个警告:不要返回对函数变量的引用,它们在函数之外不存在… |
|
|
5
0
如果类型是内部类型,则传递const refs不会提高性能,并且可能会降低性能,而且安全性也会降低;最好选择按值传递和返回。我不是很喜欢asm,但据我所知,通过引用return意味着该值不能存储在寄存器中,因为它需要一个返回地址,因此可以禁用一些其他有用的优化;不过,我对此并不肯定。 如果它是类或结构,则取决于值的生存期;如果它是函数的本地值,则无法返回它;否则,如果它是类成员,则我更喜欢const type&return,因为它可以通过避免复制构造函数来提供更好的性能。(观点不同,因为按价值计算更安全)。它还使您不必实现复制构造函数或使用可能有害的默认值,这很好。 |