使用vector和QVector进行奇怪的内存管理

时间:2012-06-19 00:45:56

标签: c++ qt

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

  • 编译:GCC 4.5.2
  • 操作系统:Linux Ubuntu 11.04
  • 观察:向量的容量或大小始终是2的幂

代码是:

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;

输出结果为:

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

2 个答案:

答案 0 :(得分:4)

你所看到的是std::vector的扩展能力。在一般情况下,它们使其更快地工作的一个原因是保留了比所需内存更多的内存,因此每次使用push_back时都不必保留内存。

正如你所看到的,越多越保留它。 capacity是告诉您此金额的函数。您可以使用reserve来测试此理论。它会告诉向量要保留多少内存,如果没有进行任何操作,capacity将检索该数字(这可能导致保留内存的另一个更改)。 reserve通常非常有用,如果您即将push_back大量元素,并且您希望向量仅保留足够的内存一次,而不是自动保留多次。

您正在寻找的功能是size,它可以为您提供向量中的元素数量。与此相关联的函数为resizereservecapacity。也就是说,当你致电resize (10)时,如果你之前有5个元素,你将获得5个默认初始化的新元素,size返回10。

答案 1 :(得分:0)

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

如果我们谈论容量细节,那么容量的变化将取决于供应商的实施。您基于2的幂重新分配数组的事实可能不适用于所有情况:例如,我已经看到一些实现按比例缩放150%,而不是200%。

capacity通常大于大小,有时甚至更大(例如:元素数量的两倍)。这是因为载体是可生长的,连续的序列(它们是基于阵列的)。如果你完全关心性能,那么你想要的最后一件事就是每次push_back / insert / erase都会触发内存分配/释放,因此vector通常会创建一个比后续插入所需的更大的数组。值得注意的是,clear方法不一定会影响容量,您可能希望查看缩小到适合的习惯用法(http://www.gotw.ca/gotw/054.htm)。

如果您想要对容量进行绝对控制以便完美匹配,则可以使用预留方法提前分配特定容量。这只会很好,但如果你能提前预测你将要放入矢量的元素数量。