c++ - 有人可以解释一下这行代码吗

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

我正在观看有关如何在C++中实现自己的vector / dynamic_array的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是什么。
谢谢你的解释。 :)

最佳答案

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

new(&m_Data[m_Size])T(std::forward<Args>(args)...);
假设我们调用“正常”的new运算符:
new T((std::forward<Args>(args)...);
这将分配大小等于sizeof(T)的内存,并在该内存地址处调用T类型的构造函数。 std::forward用于称为“完美转发”的技术中。简而言之:没有副本,没有移动,没有以任何方式传递-参数只是被赋予构造函数,就像您直接调用它一样。
但是,如果您已经预先分配了内存-许多容器(例如 vector )的主要性能提升点,该怎么办? Placement new运算符是您的 friend 在这里。您为它提供了预分配内存的地址,并且它仅构造对象。而且以后不需要delete,因为您没有使用placement new分配任何东西!
那破坏呢?通常,当您用delete对象时,析构函数会自动调用。在这种情况下,您必须像这样直接调用对象的析构函数-t->~T();

关于c++ - 有人可以解释一下这行代码吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63547146/

相关文章:

C++ 如何将指针 vector (双指针)作为常量传递给函数

c++ - 如何从具有重复项的 vector 中仅删除一个元素

java - 分离模型、 View 和 Controller 的最佳方法

algorithm - 从列表中查找 XOR 值最小的对

c++ - 公共(public)设置方法的替代方法

java - 无法打开包含文件 : 'jni.h' : No such file or directory

java - 为什么使用无名对象会出错?

c++ - GDI 对象 HBRUSH 半透明

c++ - 为什么插入运算符打印地址而不是字符串?

c++ - 我可以使用插入函数将元素添加到 vector 的 vector 中吗?