QtInternal 之 高效使用QString

2021-05-26 07:58:52 字數 1354 閱讀 4688

usingqstringeffectively

簡體中文版 ,如果你對翻譯wiki感興趣,請參考wiki中文幫助

從c字串建立乙個qstring可能會涉及到malloc。舉例來說,下面的**可能會有乙個隱式malloc呼叫的代價。

應用程式開發者在main()函式中設定 qtextcodec::setcodecforcstring() 卻沒有意識到對每乙個c風格字串的比較都有乙個malloc的***。

由於在程式中和latin-1編碼的c字串的比較非常常見。qt提供了乙個握有latin-1編碼c字串指標的被稱作 qlatin1string 的特殊的類。除此之外,qstring 提供了過載的 qstring::operator==(const qlatin1string &) 來呼叫比較unicode字串和latin1字串的特殊函式。我們通過寫成下面這樣可以使上面的**確定無疑地很快(即無論是是否設定了setcodecforcstring),

在qt自身**中,所有的c字串的比較都使用了qlatin1string,這是因為應用程式可以為c字串選擇任意編碼。

qstring 為字串操作提供了各種成員比如mid()、left()、right()。它們都建立會乙個新的字串,因此有乙個對在已存在qstring的malloc和深拷貝。 與此相反,qstring::midref()、qstring::leftref()與qstring::rightref()可以用來獲取乙個qstringref。qstringref 是對qstring一部分的乙個引用。為了優化,qstring 也提供了許多過載比如 qstring::operator==(const qstringref &) 來配合qstringref。

下面的**需要至少兩次 malloc。第一次molloc用來存放 "(" + type 的結果。然後另乙個malloc用來追加 ")"。隨著操作符"+"的增加molloc的書目相應增加。

if (foo.startswith("(" + type + ")"))
如果最終字串的長度提前已知的話,額外的malloc就可以避免。qt 4.6 引入了乙個為單次呼叫的連線鏈(concatenation chain)預留記憶體的名為 qstringbuilder 的內部類。它通過為上面的每個+操作返回乙個不同的類(不再是qstring)來實現這一點。該類跟蹤被追加的每個字串和每一步需要的記憶體。在最後一步,當連線操作被轉換成乙個qstring時它將分配一次記憶體並將所有字串依次拷貝進來。該特性可以通過qt_use_fast_concatenation來啟用。有了這個定義,我們可以使用操作符 "%" 而不是 "+"。現在可以這樣寫,

if (foo.startswith("(" % type % ")"))
快速連線

boyer-moore 字串搜尋演算法 來實現快速搜尋。

mysql之高效sql注意

今天扯淡下我們寫sql應該注意些什麼,歡迎拍磚,互相學習!注意點說明 1.全值匹配最好 2.最左字首法則,如果索引了多列,要遵循最左字首法則。指的是查詢從索引的最左前列開始並且不跳過索引中的列 3.不在索引列上做任何操作 計算 函式 自動或手動型別轉換 會導致索引失效而轉向全表掃瞄 4.範圍條件右邊...

團隊協作方法之 高效使用任務故事牆

一般來說,在平常的工作中,使用故事牆的時候都會跟每日站立會結合起來。在每天的站立會上,團隊成員站立在故事牆前面,每個成員輪流講解自己的工作進度,方便每個人了解專案當前的狀況,對於提公升團隊協作效率有很大的幫助。那麼,這個故事牆應該如何建立呢?下面我從三個方面來分析。如上圖所示,一面簡潔的故事牆製作起...

SQL優化之高效SQL語句

一 sql語句的執行步驟 from子句組裝來自不同資料來源的資料 from後面的表關聯,是自右向左解析的,即在寫sql的時候,盡量把資料量大的表放在最右邊來進行關聯 where子句基於指定的條件對記錄行進行篩選 where條件的解析順序是自下而上,從右到左的,即應把能篩選出大量資料的條件放在wher...