【问题标题】:Can someone please explain this line of code有人可以解释一下这行代码吗
【发布时间】:2020-08-23 12:48:57
【问题描述】:

我正在观看有关如何在 C++ 中实现自己的向量/动态数组的 youtube 视频。 除了类似代码之外,我了解所有内容,我是 C++ 新手,并试图了解下划线数据结构的实现。 但是我没有看到这样一行代码。 代码:

template<typename... Args>
T& EmplaceBack(Args&&... args) {
    if (m_Size >= m_Capacity) {
        ReAlloc(m_Capacity + m_Capacity / 2);
    }
    new(&m_Data[m_Size])T(std::forward<Args>(args)...); 
    return m_Data[m_Size++];
}

我没看懂的那一行:

new(&m_Data[m_Size])T(std::forward<Args>(args)...);

那行代码到底在做什么? 顺便说一句,我真的不知道std::forward 是什么。 谢谢任何解释。 :)

【问题讨论】:

  • 这种new的用法叫做placement-new,查一下。至于std::forward,看完美转发。
  • 你会发现实际学习和理解 C++ from a good C++ textbook 比从一些随机的 Youtube 视频中容易得多,任何小丑都可以制作和上传。您提到的所有内容都在教科书中以有条理的逻辑顺序进行了解释。否则,就像这里的情况一样,您将面临来自 C++ 中完全不同知识领域的许多不同概念(放置新、完美转发),并且您不知道所有这些是如何工作的,而无需学习它,在有组织的方式。

标签: c++ vector data-structures dynamic-arrays


【解决方案1】:

这行代码在地址 &m_Data[m_Size] 处构造了一个 T 类型的对象,其参数为 args...。不涉及内存分配。

new(&m_Data[m_Size])T(std::forward<Args>(args)...);

假设我们称之为“普通”new 运算符:

new T((std::forward<Args>(args)...);

这将分配大小等于 sizeof(T) 的内存,并在该内存地址调用 T 类型的构造函数。 std::forward 用于称为完美转发的技术中。简而言之:没有副本,没有移动,没有以任何方式传递 - 参数只是提供给构造函数,就像你直接调用它一样。

但是,如果您已经预先分配了内存——许多容器的主要性能提升点,比如向量,该怎么办? Placement new 运营商是您的朋友。您向它提供预分配内存的地址,它只构造对象。以后不需要delete,因为你没有用placement new分配任何东西!

破坏呢?通常,当您 delete 对象时会自动调用析构函数。在这种情况下,您必须直接调用对象的析构函数,就像这样 - t-&gt;~T();

【讨论】:

    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多