2017-01-01 28 views
0

在QString構造函數和其他函數中QChar是通過值傳遞的,而不是通過const ref:QString(QChar ch),但是它本身是一個類(class QChar),而不是POD類型。爲什麼它通過了?爲什麼在Qt代碼中的QChar是通過值而不是const引用傳遞的?

+5

考慮到'QChar'處理一個「** 16位** Unicode字符」,類內的數據可能足夠小(比如說16位?),這樣複製就變得微不足道了。請記住,在典型的現代(32位或64位)系統中,「int」是32位,並且按值複製並傳遞,沒有任何問題。 –

+2

因爲價值語義很好,並且沒有性能影響。 –

+1

強制性閱讀:http://www.macieira.org/blog/2012/02/the-value-of-passing-by-value/ – peppe

回答

3

Qt 5.6.2中的QChar類有一個數據成員,unsigned short。因此在大多數平臺上sizeof(QChar)將爲2。這比你通常的指針(通常是4或8字節)要小。

因此,您可以將QChar視爲與任何其他基本類型相同。事實上,它旨在以這種方式工作,因爲它取代了Qt API中的char

通過const ref傳遞的原因是效率,對大型對象來說非常合理。在這種情況下,按價值傳遞意味着昂貴的副本。所以你交易一個額外的間接尋址(因爲在引擎蓋下引用通常是用指針實現的),並且更好。對於推理不成立的基本類型。複製是便宜的,因此通過價值傳遞並避免增加間接性效率更高。

+0

2字節的確很小,但如果更多的數據字段被添加到類中未來 - 代碼將需要更改... –

+0

@觸發器 - 爲什麼需要更改代碼?無論大小如何,相同的代碼都可以工作。 ** QChar'不可能超過32位,因爲這需要超過40億個字符的語言。 – dtech

+0

在Qt 5的一生中它永遠不會發生。Qt具有嚴格的二進制兼容性策略。 – peppe

0

有人說,這是因爲QChar只有2個字節,而指針是4或8個字節,所以效率更高。

但是,這不是完整的故事。現代機器在傳遞一個單字節時需要同時傳遞體系結構原生指針,最終它們都以32位或64位寄存器結束。儘管當時情況並非如此,機器在傳遞大整數時速度要慢得多,但它們的指針不是4或8字節長。所以最好的情況是,如果你說像30年前那樣通過一個16位機器的值而不是通過引用來傳遞一個字節,那麼會有一些收益。

請記住,如果實際傳遞引用,它只是一個指針,所以低效率更多地使用額外的間接層。爲什麼只要傳遞一個指針就可以在內存中的其他位置尋找該對象,何時可以傳遞該對象本身。至少在理論上。

實際上,編譯器非常擅長優化。任何類型的函數都可以在熱點中調用,並且可能會導致有形的開銷,這將是微不足道的,因此將由編譯器內聯而不是調用,因此不會傳遞任何參數。如果您比較兩個微不足道的函數,一個通過值傳遞,另一個通過引用傳遞,您將意識到它們導致完全相同的機器代碼。

因此,它是有價值的,因爲這是理論上有意義的,即使它在實踐中並不重要。而且因爲你在打字時節省了一些。如果要修改函數外部的對象,只需要通過引用傳遞。

相關問題