c++ - std::uninitialized_fill() 和 std::get_temporary_buffer()

标签 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 在他的书中指出“奇怪的构造 (&*) 负责处理不是指针的迭代器。在那种情况下,我们需要获取通过取消引用获得的元素的地址来获取指针”。

我有三个问题

  1. “不是指针的迭代器”是什么意思?除了指针的泛化之外,它们还能是什么?更令人困惑的是,我们需要将解引用获得的元素的地址获取指针。
  2. 在语法上 ::newnew 是一样的。使用 :: 有特殊原因吗?
  3. get_temporary_buffer() 在概念上是否与 MyClass * p3 = (MyClass*)::operator new (sizeof(MyClass)); 分配存储空间相同?两个不同的东西?

能否为所有问题提供一个小示例?

最佳答案

我不确定这是否是您的意思,但您的观点确实有道理。

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

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

关于c++ - std::uninitialized_fill() 和 std::get_temporary_buffer(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25184365/

相关文章:

c++ - 在一个线程上删除具有数百万个字符串的大型 HashMap 会影响另一个线程的性能

c++ - Qt/C++检测QPushButton悬停播放声音

c++ - 创建玩家 vector 并向每个玩家添加信息

java - 为什么 JVM 总分配内存大于 -Xmx?

performance - gcc 可能不太可能使用宏

c# - 如何获取任务管理器中显示的应用程序内存使用情况?

c++ - 以引用作为值的 std::unordered_map 不起作用?

c++ - 我什么时候应该在 C++ 中重载 new/delete

c++ - 防止死锁共享升压互斥锁

关于内存对齐示例的困惑