vector和string的内存管理

        vector 和 string是stl中比较常用的容器,它们都能随着数据的增加自动增加自身的容量。

        vector是用动态数组实现的,当vector没有元素时,数组大小为0,一旦vector中加入元素,加入元素后的总大小大于当前vector的容量时,vector会开辟一块更大的空间,将原来的元素拷贝到新的空间,然后析构原来的元素,最后释放原来所占用的空间。所以当不断有元素加入到vector容器时,所花费的代价还是挺高的。幸好vector提供了一个reserve函数可以将空间直接扩大到想要的空间的大小,避免多次开辟空间,拷贝元素,析构元素这些操作。

        如果将vector容器的元素删除一些,希望释放多余的空间,那怎么办呢。遗憾的是reserve函数只能增加容器的容量,而不能减少,当vector发现reverse的参数比容量小时,它什么也不做,直接返回了。stl提供了swap方法来释放vector多余的空间,不过使用的时候不那么明显。swap的函数的本意是交换,即交换两个容器的元素,我们可以通过声明一个临时的vector容器,将vector容器的元素拷贝到临时容器中去,然后将vector容器和临时容器交换,由于临时容器添加的元素是vector容器的元素,所以它不会有很多多余的空间(这也和不同的stl实现厂家相关)。总之一句话,reserve函数可以增加vector容器的容量,swap函数可以减小vector容器容量。

        string容器的内存管理情况和vector容器大致相同,只是有细微的差别。string也是根据元素的多少自动增加自身的容量,它也可以通过reserve函数直接增加容量。不同的是string通过reserver函数减少容量,而不是通过swap函数。我在redhat和suse上都尝试过,他们的实现结果都是这样的,我暂时还不清楚string的swap函数的实现为什么没有减少它的容量,如果读者知道,请告诉我一下。

        下面是我写的测试vector和string的代码,代码在redhat 5 上可以通过编译和运行,其中vector和string的容量增长是按2的倍数增长的,即每当容量超过是,容量加倍。

#include<stdio.h>
#include<vector>
#include<string>

using namespace std;
typedef vector<int> intV;

void testvector()
{
    printf("---------testvector----------\n");
    intV intv;
	int i = 0;
	int n = 1000;
	int capacity = intv.capacity();
	printf("size:%d, capacity:%d\n", intv.size(), intv.capacity());
    for(i = 0; i < n; i++)
    {
        if(capacity != intv.capacity())
	    {
	        printf("capacity:%d\n", intv.capacity());
			capacity = intv.capacity();
	    }
		intv.push_back(i);
    }

    intv.clear();
    intv.reserve(1000);
    for(i = 0; i < 10; i++)
    {
		intv.push_back(i);
    }
	printf("size:%d, capacity:%d\n", intv.size(), intv.capacity());

    intv.reserve(50);
	printf("after reserve size:%d, capacity:%d\n", intv.size(), intv.capacity());
	intV(intv).swap(intv);
	printf("after swap size:%d, capacity:%d\n", intv.size(), intv.capacity());

}

void teststring()
{
    printf("\n\n---------teststring----------\n");

    string str;
	int i = 0;
	int n = 1000;
	int capacity = str.capacity();
	printf("size:%d, capacity:%d\n", str.size(), str.capacity());
    for(i = 0; i < n; i++)
    {
        if(capacity != str.capacity())
	    {
	        printf("capacity:%d\n", str.capacity());
			capacity = str.capacity();
	    }
		str += "0";
    }

    str.clear();
    str.reserve(1000);
    for(i = 0; i < 10; i++)
    {
		str += "0";
    }
	printf("size:%d, capacity:%d\n", str.size(), str.capacity());

	string(str).swap(str);
	printf("after swap size:%d, capacity:%d\n", str.size(), str.capacity());

    str.reserve(10);
	printf("after reserve size:%d, capacity:%d\n", str.size(), str.capacity());
}

int main()
{
    testvector();
    teststring();

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值