Что означает этот код C ++ - PullRequest
1 голос
/ 26 мая 2010

Я пытался понять, как webkit анализирует URL-адреса, и мне трудно разобраться в этом:

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) часть.

Я думаю, что это смущает меня больше всего, потому что я не могу найти, где буферизована переменная буфера где-либо (разве это не должно быть что-то вроде Vector<char, 4096> buffer = new Vector<char, 4096>(...)?

Заранее спасибо

Ответы [ 5 ]

2 голосов
/ 26 мая 2010

Переменная buffer построена именно на этой строке:

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

Проходя шаги, которые выполняет компилятор, он сначала гарантирует, что в стеке есть sizeof(Vector<char, 4096>) байтов пространства, в которое он может построить объект Vector<char, 4096> buffer. Затем он вызывает конструктор Vector<char, 4096>, который может занять int (поскольку fragmentEnd * 3 + 1 является int) в хранилище в стеке.

В текущих Vector источниках нет конструктора, который принимает int. Однако существует конструктор, который принимает size_t (без знака int), поэтому компилятор статически преобразует результат fragmentEnd * 3 + 1 в size_t и вызывает этот конструктор.

2 голосов
/ 26 мая 2010

Я понял, что он создает вектор типа char, причем каждая запись представляет собой массив char размером 4096 байт

Это не так. Шаблон WTF :: Vector принимает два параметра шаблона. Первый тип элемента (в данном случае char, что означает, что каждый элемент является char, а не массив символов). Второй - это встроенная емкость, т. Е. Число байтов, которые вектор может хранить без выделения дополнительной памяти в куче.

но я не получаю часть буфера (фрагментEnd * 3 + 1).

Синтаксис для создания переменной в стеке: type variablename(constructor,arguments);. Так buffer - это имя переменной, а fragmentEnd * 3 + 1 - аргумент конструктора Vector<char, 4096> (который задает начальный размер вектора).

1 голос
/ 26 мая 2010

По ссылке Юлиана, источник для метко названного WTF::Vector говорит, что второй параметр шаблона называется inlineCapacity.

Итак, это как-то связано с некоторой оптимизацией, которая не должна иметь ничего общего с функциональностью. Игнорируй это. Размер буфера fragmentEnd * 3 + 1, не более или менее.

1 голос
/ 26 мая 2010

Ознакомьтесь с дополнительной информацией об используемом классе Vector (это Vector из webkit (пространство имен WTF), а не из std).

Проверьте заголовочный файл Vector.h. Здесь .

1 голос
/ 26 мая 2010

Нет, не должно, new может использоваться или не использоваться для выделения нового объекта в C ++, в отличие, например, от C #.

Пояснение:

Vector не является стандартным классом, как вектор STL.

Строка создает буфер объектов в стеке типа Vector. Затем он передает параметры конструктору (что в скобках)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...