有人可以解释一下这行代码吗
Can someone please explain this line of code
我正在观看有关如何在 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
接线员是你的朋友。您向它提供预分配内存的地址,它只构造对象。以后不需要 delete
,因为你没有用 placement new
!
分配任何东西
毁灭呢?通常,当您 delete
对象时,会自动调用析构函数。在这种情况下,您必须直接调用对象的析构函数,就像这样 - t->~T();
我正在观看有关如何在 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
接线员是你的朋友。您向它提供预分配内存的地址,它只构造对象。以后不需要 delete
,因为你没有用 placement new
!
毁灭呢?通常,当您 delete
对象时,会自动调用析构函数。在这种情况下,您必须直接调用对象的析构函数,就像这样 - t->~T();