c++ vector内存分配、内存分布堆栈

vector内存分配、内存分布

测试代码

#include <iostream>
#include <vector>
#include <unistd.h>
using namespace std;
int main()
{
        int x;
        vector<int> vint;
        vint.push_back(5);
        vint.push_back(9);
        cout <<hex<<"vint: " <<&vint<<"  x: "<<&x<< endl;
        cout <<hex<< vint[0]<< "  vint0: "<<&vint[0]<<"  vint1: "<< &vint[1]<<endl;
        sleep(60*3);
}

输出结果

编译
g++ -g -m32 -o vct vector.cpp
执行
[root@localhost test-vector-mem]# ./vct
vint: 0xfffe70a8  x: 0xfffe70b4
5  vint0: 0x8266018  vint1: 0x826601c

linux内存信息maps

[root@localhost 2428]# cat maps 
08048000-0804b000 r-xp 00000000 fd:00 73219086                           /opt/test-vector-mem/vct
0804b000-0804c000 r--p 00002000 fd:00 73219086                           /opt/test-vector-mem/vct
0804c000-0804d000 rw-p 00003000 fd:00 73219086                           /opt/test-vector-mem/vct
08266000-08287000 rw-p 00000000 00:00 0                                  [heap]
f7431000-f7434000 rw-p 00000000 00:00 0 
.............................................

fffc7000-fffe8000 rw-p 00000000 00:00 0                                  [stack]
[root@localhost 2428]# 

结果解读

  1. vint: 0xfffe70a8 vector管理器(其实就是三个指针头、尾、内存尾)在本实例函数内申请存在栈上,即谁申请谁负责存

  2. vector对象自身和对象内容的内存组成:引用 https://www.jianshu.com/p/9d400528a421
    在这里插入图片描述

  3. vint0: 0x8266018 vint1: 0x826601c, vector实际的内容对象列表,存在堆上,有STL调用底层封装的 空间配置器 std::alloc 来实现new和delete空间;

  4. 空间配置器 std::alloc 可以有效规避内存随便和效率问题;

  5. 普通new和delete过程:调用new分配内存,调用Foo()构造对象。Delete中也包括两个阶段,调用~Foo()析构对象,调用delete释放内存。
    为了分工明确,STL 中将这两个阶段分开来操作。内存配置操作由alloc::allocate()负责,内存释放操作由alloc::deallocate()负责;对象构造操作由::construct()负责,对象析构操作由::destroy()负责。配置器定义于之中,SGI 内含 stl_alloc.h stl_construct.h 前者负责内存空间的配置与释放,后者负责对象的构造与析构。
    考虑到小区块可能造成的内存破碎问题,SGI设计了双层的配置器,第一级直接使用Malloc()和free(),第二级则视情况来判断使用什么策略,当配置区块超过128KB,直接使用第一级配置器;当配置区块小于128KB,使用辅助的memory pool整理方式,而不再求助于第一级配置器。无论使用第一级还是第二级配置器,都封装成了不接收参数的alloc,然后有简单的封装成simple_alloc类。这个类使得空间配置器对外有了标准接口。

vector源码

  1. 引用https://www.cnblogs.com/sooner/p/3273395.html
#include<iostream>
using namespace std;
#include<memory.h>  

// alloc是SGI STL的空间配置器
template <class T, class Alloc = alloc>
class vector
{
public:
    // vector的嵌套类型定义,typedefs用于提供iterator_traits<I>支持
    ty
  • 11
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1 STL 简介 ..............................................................................................................................................2 2 顺序性容器...........................................................................................................................................2 2.1 C++ VECTOR(向量容器) ...........................................................................................................2 2.2 C++ LIST(双向链表) .................................................................................................................4 2.3 C++ DEQUE(双向队列) ..................................................................................................................6 2.4 三者比较........................................................................................................................................8 3 关联容器...............................................................................................................................................8 3.1 特点................................................................................................................................................8 3.2 C++ SETS & MULTISETS .................................................................................................................9 3.3 C++ MAPS & MULTIMAPS ............................................................................................................ 11 4 容器适配器.........................................................................................................................................12 4.1 特点..............................................................................................................................................12 4.2 C++ STACKS(堆栈) ..................................................................................................................13 4.3 C++ QUEUES(队列) ......................................................................................................................13 4.4 C++ PRIORITY QUEUES(优先队列)...............................................................................................13 5 迭代器.................................................................................................................................................14 5.1 解释..............................................................................................................................................14 5.2 功能特点......................................................................................................................................14 6 C++标准库总结..................................................................................................................................15 6.1 容器..............................................................................................................................................15 6.2 算法..............................................................................................................................................15 6.3 函数对象......................................................................................................................................17 6.4 迭代器..........................................................................................................................................19 6.5 分配器..........................................................................................................................................19 6.6 数值..............................................................................................................................................19

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值