有没有在C++中通过引用比通过值更昂贵的情况?如果是这样,那么情况会是怎样?通过引用通过比价值传递更昂贵
回答
更喜欢传递原始类型(int,char,float,...)和便宜的复制(点,复杂)值的POD结构。
这比通过引用传递所需的间接方式更高效。
模板类
call_traits<T>
封装了“最好”的方法的一些类型T的参数传递到或从一个函数,并且由被定义为如下表的typedef的集合。call_traits
的目的是确保像“引用引用”这样的问题永远不会发生,并且参数以最有效的方式传递。
是的,访问通过引用参数传递可能需要比传递值参数更多的间接级别。此外,如果参数的大小小于单个指针的大小,则可能会变慢。当然,这都是假设编译器没有优化它。
您可以阅读这篇文章"Want speed ? Pass by value"关于copy elision和RVO(按价值优化返回)。它解释了引用有时会阻止编译器执行它们。
如果类型的大小相同或小于引用/指针的大小,编译器可以通过引用简单地传递值来优化传递基元类型。不能保证编译器会这样做,所以如果你有选择,按值传递原始类型。尽管如此,在模板化的代码中,你通常必须通过引用传递 - 考虑使用const引用的vector的push_back。如果你有一个int整数,你会传递一个基本类型的引用。在这种情况下,您希望编译器通过用参数替换参考值来优化该参数。由于矢量虽然可以存储大量类型,但接受常量引用是最好的选择。
“编译器可以优化...”,只要被调用者不修改referand或在调用任何可能修改它的代码后读取它。但是,当然,如果是这样的话,你希望不会问“哪个更昂贵”的问题,而是“哪个是正确的”:-)尴尬的是你认为编译器可以优化的情况,但实际上它不能,因为你忽略了某些原因它必须是一个参考(别名规则是惊喜的主要原因)。 – 2010-01-21 15:34:46
- 1. 通过值比传递通过更快
- 2. 通过传递价值
- 3. 为什么移动比通过const&?更加昂贵?
- 4. 通过引用传递与值传递
- 5. Java是通过值传递还是通过引用传递?
- 6. 通过模板传递价值
- 7. SurfaceHolder.lockCanvas()过于昂贵
- 8. 通过引用传递C++
- 9. C++通过引用传递?
- 10. cpp通过引用传递
- 11. PHP通过引用传递?
- 12. Java通过引用传递
- 13. C++通过引用传递
- 14. 通过引用传递流
- 15. JFrame通过引用传递
- 16. 通过引用传递LPCWSTR
- 17. Java通过引用传递
- 18. 通过引用传递const值的C++
- 19. 通过引用传递值类型
- 20. 在perl中通过引用传递值
- 21. JavaScript通过引用或值传递?
- 22. Java按值或通过引用传递?
- 23. 通过引用或值传递对象
- 24. PHP通过引用传递/值 - 问题
- 25. 通过值或引用传递http.ResponseWriter?
- 26. RCPP通过引用传递与按值
- 27. 防止通过引用传递右值
- 28. 无法通过引用C++传递值
- 29. 在C++上通过引用传递值
- 30. Delphi:通过引用或传递值?
那么如何才能找出他的编译器是否正在优化呢? – Arthur 2012-11-14 15:53:10
通过查看二进制代码 – 2012-11-14 21:32:04