我试图了解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>(...)
吗?
提前致谢
答案 0 :(得分:2)
我得到它正在制作一个char类型的向量,每个条目都是char 4096字节大的数组
不是。 WTF :: Vector模板有两个模板参数。第一个是元素类型(在本例中为char,表示每个元素都是char,而不是char数组)。第二个是内联容量,即向量可以在不在堆上分配额外内存的情况下存储的字节数。
但我没有得到缓冲区(fragmentEnd * 3 + 1)部分。
在堆栈上创建变量的语法是type variablename(constructor,arguments);
。所以buffer
是变量的名称,fragmentEnd * 3 + 1
是Vector<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 + 1
是int
)。
在当前的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
,或多或少。