vectors:C++中用vectors改进内存的再分配



摘要:本文描述种很常见情况:当你在某个缓存Cache中存储数据时常常需要在运行时调整该缓存Cache大小以便能容纳更多数据本文将讨论如何使用 stl vector 进行内存再分配

  这里描述种很常见情况:当你在某个缓存Cache中存储数据时常常需要在运行时调整该缓存Cache大小以便能容纳更多数据传统内存再分配技术非常繁琐而且容易出错:在 c 语言中般都是每次在需要扩充缓存Cache时候 realloc在 c 中情况更糟你甚至无法在中为 操作分配重新申请内存你不仅要自己做分配处理而且还必须把原来缓存Cache中数据拷贝到新缓存Cache然后释放先前缓存Cache本文将针对这个问题提供个安全、简易并且是自动化 c 内存再分配技术——即使用 stl vector

  用 stl vector 对象取代内建来保存获取数据既安全又简单并且是自动化

  问题分析

  在提出解决方案的前我先给出个具体例子来介绍说明 c 重新分配内存弊病和复杂性假设你有个编目应用它读取用户输入 isbns然后将的插入直到用户输入 0 为止如果用户插入数据多于容量那么你必须相应地增加它大小:

# <iostream>
using std;


{
  size=2; // 大小;在运行时调整
  *p = [size];
  isbn;
 for( n=0; ;n)
 {
  cout<< \"enter an isbn; press 0 to stop \";
  cin>>isbn;
   (isbn0)
   ;
   (nsize) // 是否到达上限?
   reallocate(p, size);
   p[n]=isbn; // 将元素插入扩容
 }
 delete p; // 不要忘了这步!
}
  注意上述这个向插入数据过程是多么繁琐每次反复循环都要检查缓存Cache是否达到上限如果是用户定义 reallocate实现如下:

# <algorithm> // for std::copy

reallocate(* &p, & size)
{
 size*=2; // double the .gif' />\'\'s size with each reallocation
  * temp = [size];
 std::copy(p, p+(size/2), temp);
 delete p; // release original, smaller buffer
 p=temp; // reassign p to the ly allocated buffer
}
  reallocate 使用 stl std::copy 算法对缓存Cache进行合理扩充——每次扩充都放大这种思路方法可以避免预先分配过多内存从量上减少需要重新分配内存这个技术需要得到充分测试和调试当初学者实现时尤其如此此外reallocate 并不通用它只能处理整型情形对于其它数据类型它无能为力你必须定义该额外版本或将它模板化幸运个更巧妙办法来实现

  创建和优化 vector

  每个 stl 容器都具备个分配器(allocator)它是个内建内存管理器能自动按需要重新分配容器存储空间因此上面可以得到大大简化并摆脱 reallocator

  第步:创建 vector

  用 vector 对象取代内建来保存获取数据循环读取 isbn检查它是否为 0如果不为 0 则通过 push_back 成员将值插入

vector: # <iostream>
# <vector>
using std;


{
 vector <> vi;
  isbn;
 while(true)
 {
  cout << \"enter an isbn; press 0 to stop \";
  cin >> isbn;
   (isbn0)
   ;
  vi.push_back(isbn); // insert element o vector
 } 
}
  在 vector 对象构造期间它先分配个由其实现定义默认缓存Cache大小般 vector 分配数据存储空间是 64-256 存储槽(slots)当 vector 感觉存储空间不够时它会自动重新分配更多内存实际上只要你愿意你可以 push_back 任何多次甚至都不用知道次又分配是在哪里发生

  为了存取 vector 元素使用重载 操作符下列循环在屏幕上显示所有 vector 元素:

for ( n=0; n<vi.size; n)
{
 cout<<\"isbn: \"<<vi[n]<<endl;
}
  第 2步:优化

  在大多数情况下你应该让 vector 自动管理自己内存就像我们在上面中所做那样但是在注重时间任务中改写默认分配方案也是很有用假设我们预先知道 isbns 数量至少有 2000那么就可以在对象构造期间指出容量以便 vector 具有至少 2000 个元素容量:

vector <> vi(2000); // 容量为 2000 个元素
  除此的外我们还可以 resize 成员:

vi.resize(2000);// 建立不小于 2000 个元素空间
  这样便避免了中间再分配从而提高了效率
Tags:  虚拟内存分配 内存分配 内存分配访问无效 vectors

延伸阅读

最新评论

发表评论