这个C ++代码意味着什么

时间:2010-05-26 11:02:46

标签: c++ webkit

我试图了解webkit如何解析网址,而我很难做到这一点:

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>(...)吗?

提前致谢

5 个答案:

答案 0 :(得分:2)

  

我得到它正在制作一个char类型的向量,每个条目都是char 4096字节大的数组

不是。 WTF :: Vector模板有两个模板参数。第一个是元素类型(在本例中为char,表示每个元素都是char,而不是char数组)。第二个是内联容量,即向量可以在不在堆上分配额外内存的情况下存储的字节数。

  

但我没有得到缓冲区(fragmentEnd * 3 + 1)部分。

在堆栈上创建变量的语法是type variablename(constructor,arguments);。所以buffer是变量的名称,fragmentEnd * 3 + 1Vector<char, 4096>的构造函数的参数(指定向量的初始大小)。

答案 1 :(得分: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并调用该构造函数。

答案 2 :(得分:1)

不,不应该,new可能会或可能不会用于在C ++中分配新对象,例如C#。

说明:

Vector不是标准类,就像STL的向量一样。

该行在堆栈上创建Vector类型的对象缓冲区。然后它将参数传递给构造函数(括号中的内容)

答案 3 :(得分:1)

查看有关所使用的Vector类的更多信息(它是来自webkit的Vector(WTF名称空间) - 而不是来自std)。

检查Vector.h头文件。它是here

答案 4 :(得分:1)

来自Iulian的链接,恰当命名的WTF::Vector的来源说第二个模板参数名为inlineCapacity

因此,它与某种与功能无关的优化有关。忽略它。缓冲区的大小为fragmentEnd * 3 + 1,或多或少。