对C ++中原始STL实现中“构造”方法逻辑的理解

时间:2014-12-04 17:16:49

标签: c++ stl new-operator copy-constructor allocator

在浏览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. 为什么上述功能是两种T1&amp;模板上的模板。 T2?它应该是T1*表示第一个,*T1表示第二个(值)。
  3. 为什么在上述逻辑中使用了new?我查看了它的用法,并在文件vector.h
  4. 中找到了以下内容
    void push_back(const T& x) {
      if (finish != end_of_storage) {
          construct(finish, x);
            ....
            ....
        }
    

    所以基于上面,完成已经获得了内存并被传递到它。另一个参数是x,它是相同类型T的值。这些是我能够思考/理解的几个概念。

    在我看来,在整个STL逻辑中使用了非常普遍但重要的功能。有人可以解释一下这个概念吗?

1 个答案:

答案 0 :(得分:2)

这是一个展示位置new,它是一种特定类型的new,您可以直接指定要用于new的值的(已分配的)内存。

  

为什么以上功能是两种类型的模板T1&amp; T2?

在这种情况下,它是一个放置new,它接受​​一个值来通过强制转换来初始化不同类型的东西,就像你使用类的构造函数时那样。 (请注意T1语句中new的强制转换。

例如,您可以在std::string 中使用展示位置const char*构建new一个可读的简洁函数。在这里,T1 = std::string和T2 = const char*

Live example on Coliru