C++学习——STL内存管理(二)<一些遇到的坑>

这篇主要是集合一些初学者(就是我)遇到的一些反直觉的tips,如果大家也有遇到了的,可以一起交流

此外,笔者有一点想要扯扯淡的写在最前面,学习C++我认为有一点是非常重要的,就是不忘初心吧,听起来很扯,但是其实就是这样,学习C++其实就是看中了它的高效率,对速度处理的高效和对内存管理的高效

C++要处理的是海量的数据,和超大规模的运算,因此复杂非此不可

我们要时间控制在减少每一个重复的构造函数上,减少每一次内存申请上;要把内存节约保持在每一小块内存对齐上,每一次垃圾回收上

为何C++如此复杂,因为非此不可啊

1.关于STL容器对象的大小,使用sizeof()求得的大小是不变的

举个例子:

当我初始化一个key为int类型,value为指向Order这种类的指针的map之后,第一次输出sizeof()的结果,第二次输出sizeof的结果,是一样的,即sizeof不能直接用来测试对象的大小

std::map<int,Order*> tt = std::map<int,Order*>();
cout<< sizeof(tt)<<endl;
Order* order = new Order(
1000,1000,1000 ,1000, false, false,1000);
long long a = order->getOrderId();
tt.emplace(10,order);
tt.emplace(9,order);
tt.emplace(8,order);
tt.emplace(7,order);
tt.emplace(6,order);
cout<< sizeof(tt)<<endl;

参考这个文章中的介绍,原因是这样的:

【类的大小不会随着成员内容器元素个数的增加而增大,容器中的元素个数增加不会增加容器变量的大小,原因是sizeof是无法求出容器所占的内存的,这些容器申请的大部分空间都是在堆上,栈上只有一部分用于管理的指针,测试得出sizeof(list)=24,sizeof(vector)=20,sizof(map)=28,这个数值和具体的编译器实现有关】
 

这种时候需要用到的就是

这里有几个相似的可以区分一下:

size()指 目前存在的元素数。            元素个数

capacity()指 容器能存储 数据的个数      容器 容量

reserve()指定 容器 能存储数据的个数

resize()  重新 指定 有效元素的个数 ,区别与reserve()指定 容量的大小

当创建空容器时, 容量(capacity)为 0;当用完时,增加原容量的 1/2 (各编译器 可能存在差异  vs2010是这样的,mingw则 增加原容量 )--适用如 vector这种 元素连续存储的容器, 如为list则不同。

capacity 一般大于size的原因是为了避免 每次增加数据时都要重新分配内存,所以一般会 生成一个较大的空间,以便随后的数据插入。

2.STL容器map的emplace传入对象问题

提到这个主要是为了解决一个问题,就是

https://blog.csdn.net/Waves___/article/details/105756423

3.固定元素个数的构造函数

对于vector,unordered_map有这种构造函数,其它类别的我不清楚,应该都是有的,

比如
    vector〈int〉a(200,0)
再比如:
    std::unordered_map<std::string,std::string> mymap;
    mymap.reserve(6);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量化橙同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值