gpt4 book ai didi

c++ - 如果我用memcpy函数复制一个数组,可能会有什么后果: bottlenecks and perfomance changes?

转载 作者:行者123 更新时间:2023-11-30 00:53:46 35 4
gpt4 key购买 nike

出于教育目的,我正在尝试实现我的容器 Vector。
在实现它的方法储备时,我遇到了一个问题:
这是从内存中的一个位置(初始容量)重新定位元素数组的最佳方法分配给新容量的内存?
我考虑了 2 种可能性:使用循环或使用 c 函数 memcpy
这是我的实现:

template <typename T>
void MyVector<T>::reserve(int elements)
{
if (m_size >= elements) // when no need to reserve memory as at least demanded amount of memory has been already allocated
return;
m_capacity = elements;
tmp = m_array;
// allocate needed amout of memory:
m_array = new T[elements];
// copy elements ???? can I use memcpy????
for (int i = 0; i < m_size; ++i)
{
m_array[i] = tmp[i];
}
delete tmp;
}

template <typename T>
void MyVector<T>::reserve1(int elements)
{
if (m_size >= elements) // when no need to reserve memory as at least demanded amount of memory has been already allocated
return;
m_capacity = elements;
tmp = m_array;
// allocate needed amout of memory:
m_array = new T[elements];
// copy elements ???? can I use memcpy????
memcpy(m_array, tmp, m_size);
delete [] tmp;
}

问题:- 我应该考虑哪些瓶颈?
- 性能有何不同?
- 有没有更有效的方法?
- 你能告诉我一个信息来源吗,其中深入描述了 STL 容器的实现(我的目标是自己实现并与专业实现进行比较,以检查我的知识并找出需要改进的地方)

最佳答案

您不能使用 memcpy,因为重要的对象可能包含指向其他内存块的指针。

考虑一个 std::string vector :每个 vector 通常被实现为一个包含指向动态分配的字符数组的指针的小对象。如果您memcpy 字符串,您会复制指针而不是它们的实际字符数据。但是这些指针的所有权不会转移。因此,当您删除原始数组(它调用所有这些字符串的析构函数)时,它们的内存将被释放,并且您的"new"对象都有悬空指针。

使用 std::copy 是实现此目标的更好方法。

关于c++ - 如果我用memcpy函数复制一个数组,可能会有什么后果: bottlenecks and perfomance changes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15558798/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com