[英]What does this C++ code mean
我试图了解webkit如何解析url,而我却很难做到这一点:
Vector<char, 4096> buffer(fragmentEnd * 3 + 1);
此行位于1214行(您可以在此处看到: http : //trac.webkit.org/browser/trunk/WebCore/platform/KURL.cpp#L1214 )。 我知道它正在构成一个char类型的向量,每个条目都是一个4096字节大的char数组,但是我没有得到buffer(fragmentEnd * 3 + 1)
部分。
我认为这使我最困惑,因为我找不到在任何地方实例化缓冲区变量的位置(应该不是Vector<char, 4096> buffer = new Vector<char, 4096>(...)
?
提前致谢
我知道它正在构成char类型的向量,每个条目都是一个4096字节大的char数组
不是。 WTF :: Vector模板采用两个模板参数。 第一个是元素类型(在本例中为char,这意味着每个元素都是一个char,而不是char的数组)。 第二个是内联容量,即向量可以存储的字节数,而无需在堆上分配额外的内存。
但我没有得到buffer(fragmentEnd * 3 +1)部分。
在堆栈上创建变量的语法是type variablename(constructor,arguments);
。 因此, buffer
是变量的名称, fragmentEnd * 3 + 1
是Vector<char, 4096>
的构造函数的参数(用于指定向量的初始大小)。
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
并调用该构造函数。
不,它不应该, new
可以或可以不用于在C ++中分配新对象,这与C#不同。
说明:
Vector
不是STL的向量之类的标准类。
该行在堆栈上创建Vector类型的对象缓冲区。 然后将参数传递给构造函数(括号中的内容)
查看有关所使用的Vector类的更多信息(它是来自Webkit的Vector(WTF名称空间)-不是来自std)。
检查Vector.h头文件。 在这里 。
在Iulian的链接中,恰当命名为WTF::Vector
的源表示第二个模板参数名为inlineCapacity
。
因此,它与某种优化有关,而这种优化应该与功能无关。 忽略它。 缓冲区的大小为fragmentEnd * 3 + 1
,或多或少。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.