C++对原始STL实现中"construct"方法逻辑的理解

The understanding of logic of "construct" method in original STL implementation in C++

本文关键字:方法 construct STL 原始 实现 C++      更新时间:2023-10-16

在浏览Alexander Stepanov原始STL(标准模板库(源代码时,我从内存分配器函数文件中遇到了以下内容:defalloc.h

template <class T1, class T2>
inline void construct(T1* p, const T2& value) {
    new (p) T1(value);
}

我无法完全理解它,并有以下问题/疑问:

  1. 在我看来,它与 T1 类型的复制构造函数有关?
  2. 为什么上面的函数是两种类型的模板T1T2?它应该T1*为第一个,*T1为第二个(值(。
  3. 为什么在上面的逻辑中使用了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* .

科里鲁的现场例子