2010-05-26 145 views
1

我想了解的WebKit如何解析的網址,而且我有一個很難做出的這個正面或反面:這是什麼C++代碼的意思

Vector<char, 4096> buffer(fragmentEnd * 3 + 1); 

這條線是線1214(你可以請看這裏:http://trac.webkit.org/browser/trunk/WebCore/platform/KURL.cpp#L1214)。我得到它正在創建一個char類型的向量,每個條目都是char 4096個字節的數組,但我沒有得到buffer(fragmentEnd * 3 + 1)部分。

我認爲,它混淆了我大部分B/C我找不到在哪裏緩衝區變量的任何地方實例化(是不是應該更多的東西一樣Vector<char, 4096> buffer = new Vector<char, 4096>(...)

在此先感謝

+4

這是一個非常難以置信的糟糕的C++代碼塊。 – 2010-05-26 11:15:09

+1

嘿,那些'matchLetter()'行是'g','r','e','a','t';; – 2010-05-26 11:42:47

+0

哇,感謝大家的幫助! – 2010-05-26 12:38:30

回答

2

buffer變量被構造正好在該行:

Vector<char, 4096> buffer(fragmentEnd * 3 + 1); 

通過編譯器採用的步驟行走時,它首先確保有sizeof(Vector<char, 4096>)字節的空間在堆棧上成它可以構造Vector<char, 4096> buffer目的。然後它調用一個Vector<char, 4096>構造函數,該構造函數可以在棧中的存儲上執行int(因爲fragmentEnd * 3 + 1int)。

在當前的Vector來源中,沒有構造函數需要int。但是,存在a constructor that takes a size_t(未簽名的int),因此編譯器會將結果fragmentEnd * 3 + 1靜態轉換爲size_t並調用該構造函數。

1

沒有它不應new可以或可以不被用於分配在C++中的新對象,不同的是,例如,C#

說明:

Vector不是一個標準類,像STL的矢量。

該行創建類型爲Vector的堆棧上的對象緩衝區。然後它將參數傳遞給構造函數(括號中的內容)

1

查閱有關使用的Vector類的更多信息(它是來自webkit(WTF命名空間)的向量 - 不是來自std)。

檢查Vector.h頭文件。它是here

+0

完成:初始化發生在下面的行中。它需要引用Vector類中的內部緩衝區並填充它(我指的是您向我們展示的部分代碼)。 – INS 2010-05-26 11:21:29

2

我拿到它使char類型的向量,每個條目是焦炭4096個字節的大型

數組它不是。 WTF :: Vector模板需要兩個模板參數。首先是元素類型(在這種情況下是char,這意味着每個元素是一個char,而不是一個字符數組)。第二個是內聯容量,即矢量可以存儲的字節數,不需要在堆上分配額外的內存。

但我沒有得到緩衝區(fragmentEnd * 3 + 1)的一部分。

在堆棧上創建變量的語法是type variablename(constructor,arguments);。所以buffer是變量的名稱,而fragmentEnd * 3 + 1Vector<char, 4096>的構造函數(它指定向量的初始大小)的參數。

1

從Iulian的鏈接中,恰當地命名爲WTF::Vector的源表示第二個模板參數名爲inlineCapacity

因此,它與某種應該與功能無關的優化有關。忽略它。緩衝區的大小是fragmentEnd * 3 + 1,不多也不少。