std :: uninitialized_fill()和std :: get_temporary_buffer()

时间:2014-08-07 13:52:14

标签: c++ memory

在cppreference.com的std::uninitialised_fill()的实现和示例中,我在理解一些事情时遇到了一些麻烦:

template<class ForwardIt, class T>
  void uninitialized_fill(ForwardIt first, ForwardIt last, const T& value)
  {
   typedef typename std::iterator_traits<ForwardIt>::value_type Value;
   ForwardIt current = first;
      try {
       for (; current != last; ++current) {
        ::new (static_cast<void*>(&*current)) Value(value);
       }
     ....
  }

我不明白为什么static_cast我需要做(&*)

Stroustrup在他的书中指出&#34;好奇的构造(&amp; *)负责处理非指针的迭代器。在这种情况下,我们需要获取通过取消引用获得的元素的地址来获得指针&#34;。

我有三个问题

  1. 他的意思是什么&#34;非指针的迭代器&#34;?除了指针的泛化之外,还有什么可以做的?更令人困惑的是,我们需要获取通过解除引用获得的元素的地址来获取指针。
  2. 语法上::newnew是相同的。使用::
  3. 有一个特殊原因
  4. get_temporary_buffer()在概念上分配存储与MyClass * p3 = (MyClass*) ::operator new (sizeof(MyClass));相同,还是两个不同的东西?
  5. 请问您能为所有问题提供一些示例吗?

2 个答案:

答案 0 :(得分:0)

我不确定这是不是你的意思,但你确实有一个有效的观点。

可以说,一个容器只包含初始化的对象,所以如果你正在初始化一个未初始化的缓冲区,那么该缓冲区几乎肯定是一个你将使用原始指针的数组。

尽管如此,让迭代器指向 not 数组的未初始化缓冲区是微不足道的,所以我认为这是为了处理这种情况。

答案 1 :(得分:0)

  1. 迭代器可以是代理类&#39;比如vector<T>::iterator。他们可以隐藏指针并覆盖operator * () - 请参阅http://en.cppreference.com/w/cpp/iterator
  2. ::new可确保拨打新的&#39;来自全球范围(不是std::new
  3. get_temporary_buffer<T>()返回pair<T*,ptrdiff_t>,其大小为&#39;已分配&#39;,可能会少于请求。存储空间可以不同,因为它是为算法的临时缓冲区而设计的(不是为了对堆进行轮询和/或导致堆栈溢出)。