注意:本文翻譯自 http://developer.qt.nokia.com 中的 UsingQStringEffectively ,中文譯文見 簡體中文版 ,如果你對翻譯wiki感興趣,請參考Wiki中文幫助
本文解釋了QString相關的各個類的用途。
QLatin1String:避免操作符 "==" 中隱含的 malloc
從C字符串創建一個QString可能會涉及到malloc。舉例來說,下面的代碼可能會有一個隱式malloc調用的代價。
if (fruit == "apple") { ... } // possibly hidden malloc
QString 為C字符串提供了重載的比較函數 QString::operator==(const char *)。而C字符串的編碼是使用QTextCodec::setCodecForCStrings()來確定的。Qt 通過提供一個特殊的比較Unicode字符串(fruit)和Latin-1字符串('apple')的函數來執行上述比較操作。該比較操作很快且不需要malloc。
盡管如此,當QTextCodec::setCodecForCString被設置后,"apple" 將通過 QString::fromAscii() 被轉換成一個QString。這意味這QString在執行比較之前將為字符串 "apple" 分配內存並創建C字符串的一個深拷貝!
應用程序開發者在main()函數中設置 QTextCodec::setCodecForCString() 卻沒有意識到對每一個C風格字符串的比較都有一個malloc的副作用。
由於在程序中和Latin-1編碼的C字符串的比較非常常見。Qt提供了一個握有Latin-1編碼C字符串指針的被稱作 QLatin1String 的特殊的類。除此之外,QString 提供了重載的 QString::operator==(const QLatin1String &) 來調用比較Unicode字符串和Latin1字符串的特殊函數。我們通過寫成下面這樣可以使上面的代碼確定無疑地很快(即無論是是否設置了setCodecForCString),
if (fruit== QLatin1String("apple")) { ... } // fast and mentions encoding
在Qt自身代碼中,所有的C字符串的比較都使用了QLatin1String,這是因為應用程序可以為C字符串選擇任意編碼。
QStringRef:沒有 malloc 的字符串操作
QString 為字符串操作提供了各種成員比如mid()、left()、right()。它們都創建會一個新的字符串,因此有一個對在已存在QString的malloc和深拷貝。 與此相反,QString::midRef()、QString::leftRef()與QString::rightRef()可以用來獲取一個QStringRef。QStringRef 是對QString一部分的一個引用。為了優化,QString 也提供了許多重載比如 QString::operator==(const QStringRef &) 來配合QStringRef。
QString::reserve 與 QString::squeeze
最好提前調用 QString::reserve 來分配額外的內存,這樣每次調用 QString::append() 不會導致一個 malloc。額外的內存可以使用 QString::squeeze 來回收。
QStringBuilder:字符串的快速連接
下面的代碼需要至少兩次 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 % ")"))
通過定義 QT_USE_FAST_OPERATOR_PLUS, '+' 而不是 '%' 可以被使用。更多細節詳見 快速連接
QStringMatcher:字符串快速匹配
QStringMatcher 可被用來在許多字符串中迭代查找一個字符串或者在同一個字符串中查找多次。它使用 Boyer-Moore 字符串搜索算法 來實現快速搜索。
http://blog.csdn.net/dbzhang800/article/details/6567197