繁体   English   中英

此C ++代码是什么意思

[英]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 + 1Vector<char, 4096>的构造函数的参数(用于指定向量的初始大小)。

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构造函数。 但是,有一个采用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM