删除vector中的元素需要永远完成
Deleting elements in vector takes forever to complete
我有一个指针向量,在执行程序中的其他任务之前,我确实需要确保使用的内存是空闲的。我不想依靠操作系统来管理对delete
的调用,所以我想自己做,因为以后我想将这些代码移动到内存有限的嵌入式平台上。我写了下面的代码来测试一个简单的场景:我选择了int指针只是为了举例…实际的数据可能是另一回事!例如,POD或类
#include <vector>
#include <iostream>
#include <Windows.h>
#define NUM_ELEMENTS 1000000
double PCFreq = 0.0;
__int64 CounterStart = 0;
void StartCounter()
{
LARGE_INTEGER li;
if (!QueryPerformanceFrequency(&li))
std::cout << "QueryPerformanceFrequency failed!rn";
PCFreq = double(li.QuadPart) / 1000.0;
QueryPerformanceCounter(&li);
CounterStart = li.QuadPart;
}
double GetCounter()
{
LARGE_INTEGER li;
QueryPerformanceCounter(&li);
return double(li.QuadPart - CounterStart) / PCFreq;
}
int main()
{
/***** CREATE VECTOR **********/
std::cout << "Generating " << NUM_ELEMENTS
<< " elements." << std::endl;
StartCounter();
std::vector<int *>* vec = new std::vector<int*>;
for (size_t i = 0; i < NUM_ELEMENTS; i++)
{
vec->push_back(new int(i));
}
std::cout << vec->size() << " Have been generated in "
<< GetCounter() << "ms" << std::endl;
std::cout << "Destroying the vector..." << std::endl;
/***** DELETE VECTOR **********/
StartCounter();
while (!vec->empty())
{
delete vec->back(), vec->pop_back();
}
vec->clear();
delete vec;
std::cout << "It took " << GetCounter() << "ms to empty the vector!rn"
<< "Press ENTER to exit." << std::endl;
//wait for key to exit
std::cin.get();
return 0;
}
下面是控制台的输出:
Generating 1000000 elements.
1000000 Have been generated in 1077.96ms
Destroying the vector...
It took 16834.9ms to empty the vector!
Press ENTER to exit.
正如你所看到的,填充向量大约需要15秒,但消除它几乎需要17秒。
代码工作,对于1000000个元素,我得到了大约35MB的内存,然后在等待键部分之前,它开始收缩到大约1mb。但为什么这么慢呢?我该如何改善这种行为?
嗯…没有人愿意仔细阅读我的问题....不管怎样,是视觉工作室装傻…我独立运行程序,它花了不到100毫秒来填充和删除矢量!
改进是微不足道的:使用vector<int>
而不是vector<int*>
,因为每个指针只存储一个元素。
如果您的数据较大,并且您确实需要存储指针,请使用unique_ptr
或boost::ptr_vector
。现在已经不是1980年了,你可以使用RAII。
至于缓慢的清理,这可能是因为你的运行时在它们的小分配结构中有很多条目,必须遍历它们才能找到正确的条目。
如果你需要有一个指针的向量,但需要更快的释放,尝试保持指针的向量,并保持实际数据在deque
类容器(array<data_t,32>
的list
,也许?你必须自己做索引维护,但它会加快删除(em>如果这是瓶颈)。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 卷积:卷积中的最后一个元素永远不会正确
- 删除vector中的元素需要永远完成