C++对原始STL实现中"construct"方法逻辑的理解
The understanding of logic of "construct" method in original STL implementation in C++
在浏览Alexander Stepanov原始STL(标准模板库(源代码时,我从内存分配器函数文件中遇到了以下内容:defalloc.h
template <class T1, class T2>
inline void construct(T1* p, const T2& value) {
new (p) T1(value);
}
我无法完全理解它,并有以下问题/疑问:
- 在我看来,它与
T1
类型的复制构造函数有关? - 为什么上面的函数是两种类型的模板
T1
和T2
?它应该T1*
为第一个,*T1
为第二个(值(。 - 为什么在上面的逻辑中使用了
new
?我查看了它的用途,并在文件vector.h中找到了以下内容
void push_back(const T& x) { if (finish != end_of_storage) { construct(finish, x); .... .... }
因此,基于上述内容,finish已经获得了内存并传递到其中。另一个参数是 x,它是相同类型 T 的值。这些是我能够思考/理解的几个概念。
在我看来,它非常通用但重要的函数,在整个STL逻辑中使用。有人可以解释上述概念吗?
这是一个放置new
,这是一种特定的new
,您可以在其中直接指定要用于new
值的(已分配的(内存。
为什么上面的函数是两种类型T1和T2上的模板?
在这种情况下,它是一个放置new
,它接受一个值来通过强制转换初始化不同类型的内容,就像对类使用构造函数时所做的那样。 (请注意要在new
语句上T1
的强制转换(。
例如,您可以从const char*
构造一个std::string
,并在单个可读、简洁的函数中放置new
。在这里,T1 = std::string
和 T2 = const char*
.
科里鲁的现场例子
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- C++对原始STL实现中"construct"方法逻辑的理解
- Tizen Construct() Button 方法失败