首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于向量和QVector的奇怪内存管理

基于向量和QVector的奇怪内存管理
EN

Stack Overflow用户
提问于 2012-06-19 00:45:56
回答 2查看 1K关注 0票数 1

我正在开发一个基于QT的应用程序,我需要在动态(QVector )中使用向量。当检查向量的大小时,这比它应该的要高,我用STL向量进行了测试,结果是一样的。下面我给出了STL向量的问题。这种情况使我们无法了解向量的实际大小并正确地使用它。怎么修理?谢谢你的帮助。

Linux 11.04

  • Observations:
  • 编译器: GCC 4.5.2
  • OS: Linux
  • 向量的容量或大小总是基2

的幂

守则是:

代码语言:javascript
运行
复制
double PI = 3.1415926536, delta = PI/(100/2);
vector<double> A(0);
vector<double> B(0);
cout<<"Capacity A = "<<A.capacity()<<"; Capacity B = "<<B.capacity()<<endl;
for (int i = 0; i < 100; i++) {
    A.push_back(i*delta);
    B.push_back( sin( A[i]  ) );
    cout<<"A("<<i<<") = " <<A[i]<<"; B("<<i<<") = " <<B[i]<<" "<<"Size A = "<<A.capacity()<<"; Size B = "<<B.capacity()<<endl;
}

for (int i = 0; i < A.capacity(); i++) {
   cout<<"A("<<i<<") = " <<A[i]<<"; B("<<i<<") = " <<B[i]<<" "<<"Size A = "<<A.capacity()<<"; Size B = "<<B.capacity()<<endl;
}
cout<<"Size A = "<<A.capacity()<<"; Size B = "<<B.capacity()<<endl;

产出如下:

代码语言:javascript
运行
复制
Capacity A = 0; Capacity B = 0
A(0) = 0; B(0) = 0 Size A = 1; Size Y = 1    
A(1) = 0.0628319; B(1) = 0.0627905 Size A = 2; Size B = 2    
A(2) = 0.125664; B(2) = 0.125333 Size A = 4; Size B = 4    
A(3) = 0.188496; B(3) = 0.187381 Size A = 4; Size B = 4    
.    
A(99) = 6.22035; B(99) = -0.0627905 Size A = 128; Size B = 128    
.    
A(126) = 0; B(126) = 1.31947 Size A = 128; Size B = 128    
A(127) = 0; B(127) = 1.3823 Size A = 128; Size B = 128   
Size A = 128; Size B = 128
EN

回答 2

Stack Overflow用户

发布于 2012-06-19 00:56:17

你看到的是std::vector的扩展能力。在一般情况下,为了使它更快地工作,他们所投入的一件事就是保留比所需的内存更多的内存,这样它就不必每次使用push_back时都保留内存。

正如您所看到的,保留的越多越大。capacity是告诉您此金额的函数。你可以用reserve来检验这个理论。它将告诉向量要保留多少内存,在此之后,如果不执行操作(这可能导致保留内存中的另一项更改),capacity将检索该数字。如果要使用大量的元素,并且希望向量只保留一次内存,而不是自动保留很多次,reserve通常是有用的。

您要寻找的函数是size,它给出了向量中元素的数量。与此相关联的函数是resize,就像reservecapacity一样。也就是说,当您调用resize (10)时,如果您以前有5个元素,您将得到5个默认初始化的新元素,size返回10。

票数 4
EN

Stack Overflow用户

发布于 2012-06-19 01:08:50

你为什么对capacity感兴趣?你专注于内存的使用吗?否则就不需要容量方法了,您只需要关注自己的大小。

如果我们讨论的是容量细节,那么容量的变化如何取决于供应商的实现。您基于2的功率来重新分配数组的事实可能并不适用于所有情况:例如,我看到一些实现的比例是150%,而不是200%。

capacity通常大于大小,有时更大(例如:元素数量的两倍)。这是因为向量是可生长的,连续的序列(它们是基于数组的)。如果您关心性能的话,最不需要的是对每一个push_back/insert/erase来触发内存分配/去分配,因此向量通常会创建一个比后续插入所需的数组更大的数组。同样值得注意的是,clear方法不一定会对容量产生任何影响,您可能想看看收缩到适合的成语(http://www.gotw.ca/gotw/054.htm)。

如果你想要对能力的绝对控制,使你有一个完美的契合,你可以利用储备方法预先分配一个特定的容量。不过,如果您能够预先预测要放入向量中的元素的数量,这才能很好地工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11092998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档