map的内存分配机制分析
该程序演示了map在形成的时候对内存的操作和分配。
因为自己对平衡二叉树的创建细节理解不够,还不太明白程序所显示的日志。等我明白了,再来修改这个文档。
/*
功能说明:
map的内存分配机制分析。
代码说明:
map所管理的内存地址可以是不连续的。如果key是可以通过<排序的,那么,map最后的结果是有序的。它是通过一个平衡二叉树来保存数据。所以,其查找效率极高。
实现方式: 限制条件或者存在的问题:
无
*/
#include <iostream>
#include <string>
#include <map> #include <windows.h> using namespace std; class CData
{
public:
CData()
{
sequence = ;
this->remark = "default string"; cout << "CData()\t" << toString() << "\t" << this << endl;
} CData(int i, string &s)
{
this->sequence = i;
this->remark = s; cout << "CData(int i,string &s)\t" << toString() << "\t" << this << endl;
} CData(const CData &data)
{
this->sequence = data.sequence;
this->remark = data.remark; cout << "CData(const CData &data)\t" << toString() << "\t" << this << endl;
} CData operator = (const CData &data)
{
this->sequence = data.sequence;
this->remark = data.remark; cout << "CData operator = (const CData &data)\t" << toString() << "\t" << this << endl; return *this;
} void setSequence(const int i)
{
this->sequence = i;
} void setRemark(const string &s)
{
this->remark = s;
} string toString() const
{
char tmp[] = { };
sprintf(tmp, "[sequence:%d | remark:%s]", this->sequence, this->remark.c_str()); //此处应该有内存复制操作,所以不用担心返回后tmp数组所指向的内存被修改或者不存在的情况。
return tmp;
} ~CData()
{
cout << "~CData()\t" << this << endl;
}
protected:
private:
int sequence;
string remark;
}; int main(int argc, char **argv)
{
cout << "process begin at " << (void*)&main << endl; string str = "baby_test";
CData data1(, str);
CData data2(, str);
CData data3(, str);
CData data4(, str);
CData data5(, str);
CData data6(, str);
CData data7(, str);
CData data8(, str);
CData data9(, str);
CData data10(, str); cout << "push CData to map" << endl;
map<int,CData> map_data;
cout << "max size of list<CData> is " << map_data.max_size() << endl;
cout << "size of list<CData> is " << map_data.size() << endl; cout << "****************map_data.push_back(data1)" << endl;
map_data.insert(make_pair(, data1));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data2)" << endl;
map_data.insert(make_pair(, data2));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data3)" << endl;
map_data.insert(make_pair(, data3));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data4)" << endl;
map_data.insert(make_pair(, data4));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data5)" << endl;
map_data.insert(make_pair(, data5));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data6)" << endl;
map_data.insert(make_pair(, data6));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data7)" << endl;
map_data.insert(make_pair(, data7));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data8)" << endl;
map_data.insert(make_pair(, data8));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data9)" << endl;
map_data.insert(make_pair(, data9));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data10)" << endl;
map_data.insert(make_pair(, data10));
Sleep( * map_data.size()); // 程序到此为止,可以看到在每次push的时候,对象的复制构造函数会调用2次。为什么是2次?
cout << "===============show map by iterator" << endl;
for (map<int,CData>::iterator itr = map_data.begin(); itr != map_data.end(); itr++)
{
// 显示的地址信息,是每次push的时候所复制的对象的地址。
cout<<"key:"<< itr->first<<"\t" << "value:address of itr is " << &(itr->second) << " and msg is " << itr->second.toString() << endl;
} cout << "===============clear map 1" << endl;
// map中的元素不是指针,此处的清理,会调用析构函数。
map_data.clear(); cout << "****************map_data.push_back(data6)" << endl;
map_data.insert(make_pair(, data6));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data2)" << endl;
map_data.insert(make_pair(, data2));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data3)" << endl;
map_data.insert(make_pair(, data3));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data1" << endl;
map_data.insert(make_pair(, data1));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data10)" << endl;
map_data.insert(make_pair(, data10));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data4)" << endl;
map_data.insert(make_pair(, data4));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data7)" << endl;
map_data.insert(make_pair(, data7));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data8)" << endl;
map_data.insert(make_pair(, data8));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data9)" << endl;
map_data.insert(make_pair(, data9));
Sleep( * map_data.size()); cout << "****************map_data.push_back(data5)" << endl;
map_data.insert(make_pair(, data5));
Sleep( * map_data.size()); // 程序到此为止,可以看到在每次push的时候,对象的复制构造函数会调用2次。为什么是2次?
cout << "===============show map by iterator 2" << endl;
for (map<int, CData>::iterator itr = map_data.begin(); itr != map_data.end(); itr++)
{
// 显示的地址信息,是每次push的时候所复制的对象的地址。
// 可以看到,不管插入的数据是如何的乱序,map的结果是排好序的。
cout << "key:" << itr->first << "\t" << "value:address of itr is " << &(itr->second) << " and msg is " << itr->second.toString() << endl;
} cout << "===============clear map 2" << endl;
// map中的元素不是指针,此处的清理,会调用析构函数。
map_data.clear(); cout << "======================end of process" << endl; return ;
}
程序的输出结果:
process begin at 00C917FD
CData(int i,string &s) [sequence:1 | remark:baby_test] 0053F6F0
CData(int i,string &s) [sequence:2 | remark:baby_test] 0053F6C8
CData(int i,string &s) [sequence:3 | remark:baby_test] 0053F6A0
CData(int i,string &s) [sequence:4 | remark:baby_test] 0053F678
CData(int i,string &s) [sequence:5 | remark:baby_test] 0053F650
CData(int i,string &s) [sequence:6 | remark:baby_test] 0053F628
CData(int i,string &s) [sequence:7 | remark:baby_test] 0053F600
CData(int i,string &s) [sequence:8 | remark:baby_test] 0053F5D8
CData(int i,string &s) [sequence:9 | remark:baby_test] 0053F5B0
CData(int i,string &s) [sequence:10 | remark:baby_test] 0053F588
push CData to map
max size of list<CData> is 82595524
size of list<CData> is 0
****************map_data.push_back(data1)
CData(const CData &data) [sequence:1 | remark:baby_test] 0053F158
CData(const CData &data) [sequence:1 | remark:baby_test] 005F6F74
~CData() 0053F158
****************map_data.push_back(data2)
CData(const CData &data) [sequence:2 | remark:baby_test] 0053F108
CData(const CData &data) [sequence:2 | remark:baby_test] 005FE2A4
~CData() 0053F108
****************map_data.push_back(data3)
CData(const CData &data) [sequence:3 | remark:baby_test] 0053F0B8
CData(const CData &data) [sequence:3 | remark:baby_test] 005FE304
~CData() 0053F0B8
****************map_data.push_back(data4)
CData(const CData &data) [sequence:4 | remark:baby_test] 0053F068
CData(const CData &data) [sequence:4 | remark:baby_test] 005FE364
~CData() 0053F068
****************map_data.push_back(data5)
CData(const CData &data) [sequence:5 | remark:baby_test] 0053F018
CData(const CData &data) [sequence:5 | remark:baby_test] 005FE3C4
~CData() 0053F018
****************map_data.push_back(data6)
CData(const CData &data) [sequence:6 | remark:baby_test] 0053EFC8
CData(const CData &data) [sequence:6 | remark:baby_test] 005FE424
~CData() 0053EFC8
****************map_data.push_back(data7)
CData(const CData &data) [sequence:7 | remark:baby_test] 0053EF78
CData(const CData &data) [sequence:7 | remark:baby_test] 005FE484
~CData() 0053EF78
****************map_data.push_back(data8)
CData(const CData &data) [sequence:8 | remark:baby_test] 0053EF28
CData(const CData &data) [sequence:8 | remark:baby_test] 005FE4E4
~CData() 0053EF28
****************map_data.push_back(data9)
CData(const CData &data) [sequence:9 | remark:baby_test] 0053EED8
CData(const CData &data) [sequence:9 | remark:baby_test] 005FED9C
~CData() 0053EED8
****************map_data.push_back(data10)
CData(const CData &data) [sequence:10 | remark:baby_test] 0053EE88
CData(const CData &data) [sequence:10 | remark:baby_test] 005FEDFC
~CData() 0053EE88
===============show map by iterator
key:1 value:address of itr is 005F6F74 and msg is [sequence:1 | remark:baby_test]
key:2 value:address of itr is 005FE2A4 and msg is [sequence:2 | remark:baby_test]
key:3 value:address of itr is 005FE304 and msg is [sequence:3 | remark:baby_test]
key:4 value:address of itr is 005FE364 and msg is [sequence:4 | remark:baby_test]
key:5 value:address of itr is 005FE3C4 and msg is [sequence:5 | remark:baby_test]
key:6 value:address of itr is 005FE424 and msg is [sequence:6 | remark:baby_test]
key:7 value:address of itr is 005FE484 and msg is [sequence:7 | remark:baby_test]
key:8 value:address of itr is 005FE4E4 and msg is [sequence:8 | remark:baby_test]
key:9 value:address of itr is 005FED9C and msg is [sequence:9 | remark:baby_test]
key:10 value:address of itr is 005FEDFC and msg is [sequence:10 | remark:baby_test]
===============clear map 1
~CData() 005FEDFC
~CData() 005FED9C
~CData() 005FE4E4
~CData() 005FE484
~CData() 005FE424
~CData() 005FE3C4
~CData() 005FE364
~CData() 005FE304
~CData() 005FE2A4
~CData() 005F6F74
****************map_data.push_back(data6)
CData(const CData &data) [sequence:6 | remark:baby_test] 0053EDE0
CData(const CData &data) [sequence:6 | remark:baby_test] 005F6F74
~CData() 0053EDE0
****************map_data.push_back(data2)
CData(const CData &data) [sequence:2 | remark:baby_test] 0053ED90
CData(const CData &data) [sequence:2 | remark:baby_test] 005FED9C
~CData() 0053ED90
****************map_data.push_back(data3)
CData(const CData &data) [sequence:3 | remark:baby_test] 0053ED40
CData(const CData &data) [sequence:3 | remark:baby_test] 005FEDFC
~CData() 0053ED40
****************map_data.push_back(data1
CData(const CData &data) [sequence:1 | remark:baby_test] 0053ECF0
CData(const CData &data) [sequence:1 | remark:baby_test] 005FEE5C
~CData() 0053ECF0
****************map_data.push_back(data10)
CData(const CData &data) [sequence:10 | remark:baby_test] 0053ECA0
CData(const CData &data) [sequence:10 | remark:baby_test] 005FEEBC
~CData() 0053ECA0
****************map_data.push_back(data4)
CData(const CData &data) [sequence:4 | remark:baby_test] 0053EC50
CData(const CData &data) [sequence:4 | remark:baby_test] 005FEF1C
~CData() 0053EC50
****************map_data.push_back(data7)
CData(const CData &data) [sequence:7 | remark:baby_test] 0053EC00
CData(const CData &data) [sequence:7 | remark:baby_test] 005FEF7C
~CData() 0053EC00
****************map_data.push_back(data8)
CData(const CData &data) [sequence:8 | remark:baby_test] 0053EBB0
CData(const CData &data) [sequence:8 | remark:baby_test] 005FE2A4
~CData() 0053EBB0
****************map_data.push_back(data9)
CData(const CData &data) [sequence:9 | remark:baby_test] 0053EB60
CData(const CData &data) [sequence:9 | remark:baby_test] 005FE304
~CData() 0053EB60
****************map_data.push_back(data5)
CData(const CData &data) [sequence:5 | remark:baby_test] 0053EB10
CData(const CData &data) [sequence:5 | remark:baby_test] 005FE364
~CData() 0053EB10
===============show map by iterator 2
key:1 value:address of itr is 005FEE5C and msg is [sequence:1 | remark:baby_test]
key:2 value:address of itr is 005FED9C and msg is [sequence:2 | remark:baby_test]
key:3 value:address of itr is 005FEDFC and msg is [sequence:3 | remark:baby_test]
key:4 value:address of itr is 005FEF1C and msg is [sequence:4 | remark:baby_test]
key:5 value:address of itr is 005FE364 and msg is [sequence:5 | remark:baby_test]
key:6 value:address of itr is 005F6F74 and msg is [sequence:6 | remark:baby_test]
key:7 value:address of itr is 005FEF7C and msg is [sequence:7 | remark:baby_test]
key:8 value:address of itr is 005FE2A4 and msg is [sequence:8 | remark:baby_test]
key:9 value:address of itr is 005FE304 and msg is [sequence:9 | remark:baby_test]
key:10 value:address of itr is 005FEEBC and msg is [sequence:10 | remark:baby_test]
===============clear map 2
~CData() 005FEEBC
~CData() 005FE304
~CData() 005FE2A4
~CData() 005FEF7C
~CData() 005F6F74
~CData() 005FE364
~CData() 005FEF1C
~CData() 005FEDFC
~CData() 005FED9C
~CData() 005FEE5C
======================end of process
~CData() 0053F588
~CData() 0053F5B0
~CData() 0053F5D8
~CData() 0053F600
~CData() 0053F628
~CData() 0053F650
~CData() 0053F678
~CData() 0053F6A0
~CData() 0053F6C8
~CData() 0053F6F0
map的内存分配机制分析的更多相关文章
- list的内存分配机制分析
该程序演示了list在内存分配时候的问题.里面的备注信息是我的想法. /* 功能说明: list的内存分配机制分析. 代码说明: list所管理的内存地址可以是不连续的.程序在不断的push_back ...
- vector的内存分配机制分析
该程序初步演示了我对vector在分配内存的时候的理解.可能有误差,随着理解的改变,改代码可以被修改. /* 功能说明: vector的内存分配机制分析. 代码说明: vector所管理的内存地址是连 ...
- memcached学习——memcached的内存分配机制Slab Allocation、内存使用机制LRU、常用监控记录(四)
内存分配机制Slab Allocation 本文参考博客:https://my.oschina.net/bieber/blog/505458 Memcached的内存分配是以slabs为单位的,会根据 ...
- Keil C动态内存管理机制分析及改进(转)
源:Keil C动态内存管理机制分析及改进 Keil C是常用的嵌入式系统编程工具,它通过init_mempool.mallloe.free等函数,提供了动态存储管理等功能.本文通过对init_mem ...
- Go语言内存分配机制
前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...
- 阿里面试官:小伙子,你给我说一下JVM对象创建与内存分配机制吧
内存分配机制 逐步分析 类加载检查: 虚拟机遇到一条new指令(new关键字.对象的克隆.对象的序列化等)时,会先去检查这个指令的参数在常量池中定位到一个类的符号引用,并且这个符号引用代表的类是否 ...
- JVM的艺术-对象创建与内存分配机制深度剖析
JVM的艺术-对象创建与内存分配机制深度剖析 引言 本章将介绍jvm的对象创建与内存分配.彻底带你了解jvm的创建过程以及内存分配的原理和区域,以及包含的内容. 对象的创建 类加载的过程 固定的类加载 ...
- Memcache简介 & 内存分配机制
关于这个东西里面到底应该存放数据网上一直有很多种说法,有的说sql进行md5之后作为键值,结果作为内容存放,也有人说按照业务逻辑错放,反正是炒的不亦乐乎. 本人经过将近2 ...
- SQL Server ->> Memory Allocation Mechanism and Performance Analysis(内存分配机制与性能分析)之 -- Minimum server memory与Maximum server memory
Minimum server memory与Maximum server memory是SQL Server下配置实例级别最大和最小可用内存(注意不等于物理内存)的服务器配置选项.它们是管理SQL S ...
随机推荐
- python面向对象之 封装(Day25)
封装: 隐藏对象的属性和实现细节,仅对外提供公共访问方式 好处:1.将变化隔离 2.便于使用 3.提高复用性 4.提高安全性 封装原则: 1.将不需要对外提供的内容隐藏起来 2.把属性都隐藏,提供公共 ...
- Django Rest Framework(一)
一.什么是RESTful REST与技术无关,代表一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”. REST从资源的角度审 ...
- Docker部署JavaWeb项目实战
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何在Ubuntu14.04 64位系统下来创建一个运行Javaweb应用程 ...
- Loadrunder脚本篇——Run-time Settings之Preferences
打开Preferences设置对话框,这里提供了对运行时的参数选择设置 Enable Image and Text Check 开启图片和文本检查.允许用户在回放期间通过web_find(文本检测)或 ...
- 03_Hadoop简单介绍以及版本信息
一.海量数据: 量:大.数目多,数据量到达PB.ZB级别,条目数到达几十亿条.百亿条 1)存储:分布式,集群的概念,管理(主节点.从节点),HDFS(HadoopDistributedFileSyst ...
- sql中in和exists的区别效率问题 转
in 和exists in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询. 一直以来认为exists 比in 效率高的说法是不准确的.如果 ...
- 树莓派使用DHT11温湿度传感器(C语言程序)
pi4j是基于wiringpi开发的通过java来控制树莓派GPIO口的库文件.在java程序中引入相关类就可以使用已经封装好的方法控制树莓派GPIO口. pi4j官网:http://pi4j.com ...
- Django---view视图FBV&CBV
一:创建项目和应用: 或者用命令创建: 1:django-admin.py startproject CBV&FBV 2: cd CBV&FBV (路径切到该文件夹下) 3: pyth ...
- Python编程-数据类型方法
一.进制简介 进制也就是进位制,是人们规定的一种进位方法.对于任何一种进制---X进制,就表示某一位置上的数运算时是逢X进一位.十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x ...
- R读取大数据data.table包之fread
>library(data.table)>data=fread("10000000.txt")>Read 9999999 rows and 71 (of 71) ...