c++ 多维vector内存占用问题分析

当我们需要长度不定的容器时,vector是一个不错的选择,它可以存储单维度的不定个数的数据,也可以叠加维度,实现不定长的二维甚至多维数组的功能。
比如使用vector<vector<double>>就可以定义二维的vector容器。

vector容器的特性是在被定义的时候,它就会自动预留16个存储空间,在二维的情况下,如果让他存储double数据,它最少的内存空间需求就是8 * 16 * 16=2592 Byte(一个double是8个Byte)
如果是3维的vector
vector<vector<vector<double>>>
其最少的占用内存数据可以达到8 * 16 * 16 * 16 个Byte。

在大数据量的模式下,多维内存占用问题成为一个必须面对的问题。

笔者写的程序中,需要存储一系列4*4的数组,一开始使用的是三维vector模式,内存占用较高,程序的可拓展性受到限制。后来经过请教高手 筱傑(qq840465812),改为用vector里面存储数组的模式(内嵌数组模式),即定义如下数据类型

using elm_type = array<array<double, 4>, 4>;
vector<elm_type> arr;

用来代替三维vector中里面嵌套的两维数据,改进后效果比较明显,内存占用量不再高企。

为了测试改进前后的对比效果,我使用了如下代码:
三维vector方式:

#include<vector>
vector<vector<vector<double>>> arr1;
int main()
{
while (arr1.size()<20000)
	{
		
		vector<vector<double>> temp{ {0},{0},{0},{0},
		{0},{0},{0},{0}, 
		{0},{0},{0},{0}, 
		{0},{0},{0},{0}, };

		arr1.push_back(temp);
		cout << arr1.size()<<"  ";


	}
	Sleep(1000000);
	return 0;
}

内嵌数组模式:


#include<vector>
#include<array>


using elm_type = array<array<double, 4>, 4>;
elm_type uu;
vector<elm_type> arr;
int main()
{
while (arr.size()<20000)
	{
		
		for (int i = 0; i < 4; i++)
		{
			for (int j = 0; j < 4; j++)
				uu[i][j] = 5000;
	    }

	
		arr.push_back(uu);

		cout << arr.size()<<"  ";


	}
Sleep(1000000);
return 0;
}

上面两种方式,是通过让容器填充20000个元素,然后跳出循环。
为了简便观察内存占用情况,需要打开window的 运行程序管理观察窗口——任务管理器。
根据观察,前者的内存占用量在运行中逐步累加,最终到达43M,而后者最后停留在4.2M, 内存使用量只有前者的10%,而且运行速度也快了不少。

关于如何获得某个数据的精确内存占用量,网上有操作IDE来实现的教程,操作很复杂,我没有采用。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值