在QString構造函數和其他函數中QChar是通過值傳遞的,而不是通過const ref:QString(QChar ch),但是它本身是一個類(class QChar),而不是POD類型。爲什麼它通過了?爲什麼在Qt代碼中的QChar是通過值而不是const引用傳遞的?
回答
Qt 5.6.2中的QChar
類有一個數據成員,unsigned short
。因此在大多數平臺上sizeof(QChar)
將爲2
。這比你通常的指針(通常是4或8字節)要小。
因此,您可以將QChar
視爲與任何其他基本類型相同。事實上,它旨在以這種方式工作,因爲它取代了Qt API中的char
。
通過const ref傳遞的原因是效率,對大型對象來說非常合理。在這種情況下,按價值傳遞意味着昂貴的副本。所以你交易一個額外的間接尋址(因爲在引擎蓋下引用通常是用指針實現的),並且更好。對於推理不成立的基本類型。複製是便宜的,因此通過價值傳遞並避免增加間接性效率更高。
有人說,這是因爲QChar
只有2個字節,而指針是4或8個字節,所以效率更高。
但是,這不是完整的故事。現代機器在傳遞一個單字節時需要同時傳遞體系結構原生指針,最終它們都以32位或64位寄存器結束。儘管當時情況並非如此,機器在傳遞大整數時速度要慢得多,但它們的指針不是4或8字節長。所以最好的情況是,如果你說像30年前那樣通過一個16位機器的值而不是通過引用來傳遞一個字節,那麼會有一些收益。
請記住,如果實際傳遞引用,它只是一個指針,所以低效率更多地使用額外的間接層。爲什麼只要傳遞一個指針就可以在內存中的其他位置尋找該對象,何時可以傳遞該對象本身。至少在理論上。
實際上,編譯器非常擅長優化。任何類型的函數都可以在熱點中調用,並且可能會導致有形的開銷,這將是微不足道的,因此將由編譯器內聯而不是調用,因此不會傳遞任何參數。如果您比較兩個微不足道的函數,一個通過值傳遞,另一個通過引用傳遞,您將意識到它們導致完全相同的機器代碼。
因此,它是有價值的,因爲這是理論上有意義的,即使它在實踐中並不重要。而且因爲你在打字時節省了一些。如果要修改函數外部的對象,只需要通過引用傳遞。
- 1. 爲什麼std :: not1()通過const引用而不是通過值引用參數?
- 2. 爲什麼std :: make_pair通過值而不是通過const引用獲取輸入?
- 3. 通過const引用傳遞Qt類
- 4. 爲什麼它可以通過const引用傳遞R值而不是正常引用?
- 5. 通過引用傳遞const值的C++
- 6. JNA對象是通過引用還是通過java代碼中的值傳遞
- 7. 在C++中,通過引用傳遞一個const布爾值是不是很好?
- 8. 如何通過值傳遞而不是通過React引用?
- 9. 在JavaScript中,這個參數是如何通過值傳遞而不是通過引用傳遞的?
- 10. Java是通過值傳遞還是通過引用傳遞?
- 11. 對象可以通過值而不是通過Java中的引用傳遞嗎?
- 12. 爲什麼關於const引用的代碼示例在C++中是不同的
- 13. 爲什麼在通過值傳遞的參數的頭文件的函數聲明中const是不必要的?
- 14. 通過引用傳遞,而不是返回一個值
- 15. 通過引用傳遞參數而不是值
- 16. 通過const引用傳遞的C++
- 17. 爲什麼我們必須將值而不是地址傳遞給C++中的「通過引用調用」函數?
- 18. Qt的 - 什麼是代碼
- 19. PHP中的對象是通過值還是引用傳遞的?
- 20. 爲什麼JavaScript通過引用傳遞?
- 21. 爲什麼使用Messenger而不是將引用傳遞給Handler?
- 22. iOS傳遞值而不是引用
- 23. 代碼是如何通過引用傳遞的?
- 24. Swift:通過引用傳遞基元的用例是什麼
- 25. 爲什麼php抱怨通過引用在此代碼中傳遞?
- 26. 通過值或通過引用const傳遞std :: chrono :: duration?
- 27. Python中的這些參數是通過值還是通過引用傳遞的?
- 28. 通過引用傳遞的缺點是什麼?
- 29. 爲什麼你可以初始化一個const引用,而不是來自右值的非const引用?
- 30. 爲什麼不通過引用傳遞結構通用優化?
考慮到'QChar'處理一個「** 16位** Unicode字符」,類內的數據可能足夠小(比如說16位?),這樣複製就變得微不足道了。請記住,在典型的現代(32位或64位)系統中,「int」是32位,並且按值複製並傳遞,沒有任何問題。 –
因爲價值語義很好,並且沒有性能影響。 –
強制性閱讀:http://www.macieira.org/blog/2012/02/the-value-of-passing-by-value/ – peppe