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

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

<分区>

在遍历 Alexander Stepanov 时原始STL(Standard Template Library)源代码,我从内存分配器函数文件中遇到了以下内容: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 的值

Why the above function is template on two type T1 & T2?

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

例如,您可以从 const char* and 构造一个 std::string 并放置 new 在一个单一的、可读的、简洁的函数中。这里,T1 = std::string 和 T2 = const char*

Live example on Coliru

关于c++ - C++中原始STL实现中 "construct"方法逻辑的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27300003/

相关文章:

c++ - 在 Eclipse 中使用 PCL

c++ - 如何查找右值引用是否是显式应用 std::move 的结果?

c++ - C++ 'new' 运算符有问题吗?

c++ - std::vector::resize() 与 std::vector::reserve()

c++ - 销毁调用安置新

c++ - 使用友元函数重载新运算符

c++ - vector 初始化的 vector

c++ - 指向成员模板类的指针

c++ - c++ 排序函数中的数组项分配

c++ - 为什么 C++ 分配器要求不要求 construct() 构造 value_type 的对象?