• C++动态分配内存


    动态分配内存相信大家都听说过,不过真正用到的时候却发现自己不会用它,直接人傻了,幸亏不是在考场上,否则人就没了。

    下面我会讲三种动态分配内存的方法,大家快跟小编一起来看看吧。

    vector 动态数组 (

    我们都知道 vector 是可变长度数组,这也是 vector 的优点,我们可以利用 vector 来实现动态分配内存。

    首先我们应该知道 vector 为了保证常数的复杂度,一般情况它实际占用的内存是 2 的次方级别的,换个意思说就是 vector 并不是严格的动态分配内存,它所占的内存会比你实际所用大一些。

    我们知道 size() 函数是得到当前 vector 中的元素个数,但是它并不是当前 vector 所占用的实际内存,但是这个函数 capacity() 可以返回当前 vector 所占用的实际内存。

    然后就要开始今天的主要内容了。

    如果我们只想改变 vector 实际内存而不是想往里面插入元素,我们有一个函数叫做 reserve() 它可以规定 vector 的内存大小。

    然后如果你想顺便把元素也插入进去的话,我们还有一个函数 resize() ,它可以顺便把元素填充进去(默认为 0),我们一般所指的动态分配内存用的就是这个函数。

    // by longdie 
    #include <bits/stdc++.h> 
    using namespace std;
    vector<int> g;
    signed main() {
    	g.reserve(1000000);
    	int tmp = g.capacity();
    	g.resize(100);
    	return 0;
    }	
    

    但是就经过我的实验,这个好像是假的动态分配,就是说 resize()reserve() 这两个函数并不会真正的改变内存,他们只是不断扩大,而并不缩小,这样可以保证复杂度的正确,但是内存上就不一定对了,不过一般情况下还是可以用一下的。

    更新一下:vector 是有办法删除多余内存的,不过这个我还不会,就不讲了。

    数组动态分配内存

    这个是正版动态分配内存了,而且也非常简单,在主要用的是 newdelete 函数。
    new 函数的作用是申请内存空间,delete 函数的作用是释放内存,而且它们所获得的内存是存放在堆中的。

    好像没啥可说的,具体放一下代码吧。

    // by longdie 
    #include <bits/stdc++.h> 
    using namespace std;
    signed main() {
    	int *a = NULL;//定义指针
    	a = new int[105];//获得内存
    	delete[] a;//删除内存
    	return 0;
    }	
    

    还是建议使用这个来进行,毕竟是真正能做到完全动态分配内存。

    内存池

    无论我们如何动态分配,我们最少的使用内存也不能少于我们实际需要的元素个数,所以我们可以开一个内存池用指针来解决问题(长链剖分中的套路)。

    具体的我们开一个足够大的数组来模拟内存池,用一个固定指针来表示内存池的分配就可以了。

    给出一个代码实现。

    /// by longdie 
    #include <bits/stdc++.h> 
    using namespace std;
    int c[1000000], *p = c ,*a;
    int *get(int *a, int n) {
    	a = p, p += n;
    	return a;
    }
    signed main() {
    	int n;
    	n = 1000;
    	a = get(a, n);//分配指针为a, 大小为n的数组空间
    	a[10] = 1;
    	cout << a[10] << '
    ';
    	return 0;
    }
    

    这个是真的不常用啊,不过这个可能能优化代码时间效率。

    补充一句:这个内存池只是 OI 里的内存池,真正的内存池我看的不是很懂。

  • 相关阅读:
    现代编程语言:Rust (铁锈,一文掌握钢铁是怎样生锈的)
    mRNA(阅读链接)
    技术的极限(13): 对过程和细节的可视化
    现代编程语言:TypeScript
    现代编程语言:JavaScript
    现代编程语言:zig
    现代编程语言:Python(蛇形遍历一颗树)
    炼金术(9): 简约而不简单,永不停歇的测试 -- always_run
    软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结
    退役记
  • 原文地址:https://www.cnblogs.com/longdie/p/dongtaineicun.html
Copyright © 2020-2023  润新知