一、sharedBuffer&string如何牽手的
在之前看android camera framework代碼時,發現代碼中大量使用了string8、string16類。由於之前學習的是C#,java等高級面向對象語言唯獨沒有認真研究過C++。所以對C++中的string比較陌生。雖然他們的用法都是一樣的,但是這里還是想認真研究一下底層實現原理。
string8和string16原理基本上是一樣的,這里我們就分析常用的string8了,說到string8,我們就能想到和它有千絲萬縷的sharedbuffer類。string8的內存就是通過sharebuffer類來管理的。每個string8對象對應一個sharebuffer的對象,sharedBuffer對象的下面就是我們的string8的內存空間。string8類中有一個mString的私有域就是指向sharedBuffer下面開始處的,如下圖所示。
為了說明string8對象就是sharedBuffer下面的內存空間,我們來看看shredBuffer對象的的的alloc方法。可以看到在申請了sizeof(SharedBuffer)+size大小的空間,其中size就是我們字符串大小。
SharedBuffer* SharedBuffer::alloc(size_t size)
{
SharedBuffer* sb = static_cast(malloc(sizeof(SharedBuffer) + size));
if (sb) {
sb->mRefs = 1;
sb->mSize = size;
}
return sb;
}
上面的sharedBuffer類我們只看到確實是多申請了Buffer,沒看到是不是string8真的指向sharedBuffer對象下面的空間呢。我們來看看String8常用構造函數,下面的調用了allocFromUTF8方法。我們繼續來到allocFromUTF8 慌然看到了sharedBuffer::alloc()方法,而且申請的大小是len+1,大家想想為啥還要+1.考慮一會……………….
時間到了,大家在學習C語言的時候,都要在最后加一個’\n’換行符,也就是下面的str[len]=0;這點我思考了10分鍾。哎。我們在看看這行代碼char* str = (char*)buf->data();針對sharedBuffer的data方法,我們在下面會看到返回的是this+1.由於this指針的類型是sharedBuffer類型,所以+1就意味這加了sizeof(sharedBuffer)大小,加上這么大的大小就指向了緊挨着sharedBuffer的空間了,就是上圖所示那樣。不知道大家明白了沒有。
String8::String8(const char* o)
: mString(allocFromUTF8(o, strlen(o))) //調用
下面的函數
{
if (m