除了什么是更好或最安全的做法之外,返回函数中的值通常更快,还是仅通过引用更改参数?还是有更快的方法?C++哪个更快,返回函数中的值,还是使用引用参数?
回答
一个大对象与深拷贝将是缓慢的价值回归,如果RVO不踢。
但规模并不总是发挥作用。例如,根据平台的不同,返回1字节的对象的速度可能与返回2或4甚至8字节的对象一样快。
很多时候,它并不是关于什么更快,而是使用上下文中需要什么。在一个基元的情况下,当它的意图是输出值的时候,它通常会返回值。当对象身份问题或意图是修改实际对象时,则通过引用返回。
也有可能的限制。例如,你不应该通过引用返回本地函数,因为这是一个等待发生的问题。你可以通过引用返回一个私有成员变量,但是再次,你可以简单地将它公开。
它也取决于“引用返回”的含义,因为这可能是由引用返回的C++样式或由指针返回的C样式。后者更常用,当你在一个函数中动态地分配一个对象并且只是返回一个指向它的指针时,如果是大的或者唯一的对象,那就是要走的路。
此外,除了RVO之外,还有移动语义,这些语义在按值返回时仍会发挥作用。深层副本的开销是C++ 11刚刚解决的一个长期存在的问题。一些像Qt这样的框架通过使用浅拷贝和使用隐式共享资源来解决这个问题。
这很大程度上取决于你实际想要返回什么样的价值以及你的功能是什么样子。例如。我们是在谈论abuiltin类型,一个小/大POD,一个阵列或一个非常昂贵的对象
拷贝
移动构造函数?
特别重要的是,如果函数的结构是这样的,那么RVO/NRVO就可以应用。 (命名)返回值优化意味着编译器实际上并不是将局部变量复制到返回值中,而是直接在用于返回值的内存地址构造局部变量。
如果返回值用于在调用站点初始化变量或更改已经初始化的变量的值,这一点也很重要。编译器通常可以优化初始化,但不一定是修改
因此,例如,以下代码:
struct Foo {
int a;
};
Foo bar(){
return Foo{ 5 };
}
int main() {
Foo = bar();
}
将导致单个Foo
对象被构造而不执行任何复制。
除了可能无需复制任何东西(甚至不是一个指针 - 这大概可以通常忽略不计),使用函数的返回值还有一个好处:
编译器可能会在优化更好,因为它不是”交给指针/引用,所以它例如不必担心别名。
所以,如果你返回一个内置类型,或一个小POD,它将明确地使用返回值更好。另一方面,如果您必须更改数组中的值,那么最好使用指向该数组的指针,而不是返回数组,然后将其复制到目标数组中。
在大多数情况下: 这取决于!
凭经验: 如果(值是原语) 然后通过价值 否则返回返回参照
如果速度不是问题,总是返回值,你必须少介绍的bug机会那样。
- 1. 使用函数中的返回值C
- 2. 哪个会先执行,RAII还是函数返回值
- 3. PHP函数,按值还是按引用返回?
- 4. 日志函数调用c中的参数值和返回值#
- 5. C++中的函数返回引用
- 6. C++ 11:创建一个函数总是返回true,使用的函数参数
- 7. 返回值或使用指针参数的速度更快
- 8. 多态函数参数/返回值C
- 9. 两个函数并行使用多个参数和返回值
- 10. 在C++中直接使用函数返回值作为参考
- 11. 函数返回参数C++
- 12. 助理返回值的函数参数(CALL通过引用)
- 13. 哪个函数更快push_back,插入C++
- 14. 在C++中使用返回值调用多个函数
- 15. IndexOf函数是返回第一个索引还是Random?
- 16. Javascript中函数参数的返回值
- 17. 函数中的引用参数(&$ a),好还是坏?
- 18. node.js APIs是否对参数引用有效,还是只对返回值有效?
- 19. 速度更快/使用更好:MySQL还是PHP md5函数?
- 20. C++ - 在另一个函数中使用的返回值
- 21. PHP在另一个函数中使用函数的返回值
- 22. 在Perl函数中引用更好的返回值吗?
- 23. 从使用window.external.notify调用的C#函数返回一个值
- 24. C++返回值参数中的数据?
- 25. 使用函数返回其他函数的参数(在Python中)
- 26. 如何使用参数使用函数的返回值的另一个功能
- 27. 引用函数返回值和自动
- 28. 为函数返回引用赋值
- 29. 为什么Objective-C sqrtf()函数比只返回值的函数更快?
- 30. 在c#函数中返回一个值
编写测试并告诉我们答案 – pm100
是什么让你觉得一种方法比另一种更快? –
即使您测试了它,测试也将非常依赖于编译器和目标平台。 –