天天看點

高效操作字串的String Reference類

如下面的代碼中一個函數接受一個std::string常量引用,在其函數内部需要使用std::string的一些函數操作字串。

參數使用的是常量引用,如果傳入一個std::string就不需要額外的拷貝。但是如果調用時傳入的是一個字串常量,這時必然會生成一個std::string對象,并且會有一次記憶體拷貝。

關于字串發生拷貝可以使用下面的代碼測試:

以下用StringPiece為例來介紹。它的原理也很簡單,StringPiece内部僅持有字串指針和一個長度值,然後參照std::string的接口提供一組操作函數。比如find, find_first_of, rfind, substr. 

它析構時不會釋放字串,因為StringPiece不持有字串的所有權,也就是字串對象本身的生命周期一定要長于StringPiece對象。

可以看到StringPiece是一個模闆類,主要是因為它需要同時支援以std::string和C string傳遞的參數。

以上面提供的取子串的操作為例,一個基本思路就是建立新的StringPiece, 把它的指針指到子串的起始位置,再将長度設定為子串的長度就可以了。在這個過程并沒有出現字串的拷貝。

Enjoy it!

繼續閱讀