共享智能指针在map中的运用

测试代码

cpp 复制代码
#include <iostream>
#include <map>
#include <memory>


class Socket_RowData
{
 public:
    Socket_RowData()  
	{ 
		pin_num = 0;
	}
    ~Socket_RowData() 
	{
		/* std::cout<<"Socket_RowData::~Socket_RowData()"<<std::endl*/;
	}

public:
    void Clear()
    {
        pin_num = 0;
        m_pin_status.clear();
    }

 public:
    int pin_num;
    std::map<int,int> m_pin_status;
};

class Socket_Data
{
public:
    Socket_Data()  
	{ 
		socketrow_num = 0; 
	}
	
    ~Socket_Data() 
	{ 
		/*std::cout<<"Socket_Data::~Socket_Data()"<<std::endl*/; 
	}

public:
    void Clear()
    {
        socketrow_num = 0;
        m_socket_row.clear();
    }

 public:
    //每个插座的排数
    int     socketrow_num;
    std::map<int, Socket_RowData>  m_socket_row;
};

class Board_IOData
{
public:
    Board_IOData()  
	{ 
		socket_num = 0; 
		std::cout<<"Board_IOData::Board_IOData()"<<std::endl;
	}
	
    Board_IOData(const Board_IOData& data)  
	{ 
		socket_num = 0; 
		std::cout<<"Board_IOData::Board_IOData() copy construct"<<std::endl;
	}
	
    Board_IOData& operator=(const Board_IOData& data)  
	{ 
		socket_num = 0; 
		std::cout<<"Board_IOData::Board_IOData() assign construct"<<std::endl; 
		return *this;
	}
	
    ~Board_IOData() 
	{ 
		std::cout<<"Board_IOData::~Board_IOData()"<<std::endl;  
	}

public:
    void Clear()
    {
        socket_num = 0;
        m_socket_map.clear();
    }

public:
    //插座总数
    int socket_num;
    std::map<int,Socket_Data> m_socket_map;
};

void Test1()
{
	std::cout<<"Test1() begin"<<std::endl;
	{
		//没有使用智能指针情形
		std::cout<<"debug 1"<<std::endl;
		Board_IOData board_iodata1;
		std::map<int,Board_IOData> map1;
		map1.insert(std::make_pair(1,board_iodata1));
		std::cout<<"debug 2"<<std::endl;
		map1.clear();
		std::cout<<"debug 3"<<std::endl;
	}
	
	std::cout<<"debug ============="<<std::endl;;
	
	{
		//使用智能指针情形
		std::cout<<"debug 4"<<std::endl;
		std::shared_ptr<Board_IOData> board_iodata2(new Board_IOData);
		std::map<int,std::shared_ptr<Board_IOData> > map2;
		map2.insert(std::make_pair(1,board_iodata2));
		std::cout<<"debug 5"<<std::endl;
		map2.clear();
		std::cout<<"debug 6"<<std::endl;
	}
	std::cout<<"Test1() end"<<std::endl;
}

int main()
{
	Test1();
	
	return 0;
}
bash 复制代码
[banting@localhost test]$ g++ -g -std=c++11 -g test.cpp -o test
[banting@localhost test]$ ./test
Test1() begin
debug 1
Board_IOData::Board_IOData()
Board_IOData::Board_IOData() copy construct
Board_IOData::Board_IOData() copy construct
Board_IOData::~Board_IOData()
debug 2
Board_IOData::~Board_IOData()
debug 3
Board_IOData::~Board_IOData()
debug =============
debug 4
Board_IOData::Board_IOData()
debug 5
debug 6
Board_IOData::~Board_IOData()
Test1() end
[banting@localhost test]$

测试结果

没使用智能指针比使用智能指针在插入map时多了两次复制构造函数调用,增加数据拷贝的开销

相关推荐
dyxal15 分钟前
linux系统安装wps
linux·运维·wps
大家的笔记本31 分钟前
jetson orin super nano(arm linux系统)上读取大恒图像工业相机(型号MER-050-560U3C)教程
linux·arm开发·相机
九章云极AladdinEdu1 小时前
深度学习优化器进化史:从SGD到AdamW的原理与选择
linux·服务器·开发语言·网络·人工智能·深度学习·gpu算力
青草地溪水旁1 小时前
Linux epoll 事件模型终极指南:深入解析 epoll_event 与事件类型
linux·epoll
..过云雨2 小时前
04.【Linux系统编程】基础开发工具2(makefile、进度条程序实现、版本控制器Git、调试器gdb/cgdb的使用)
linux·笔记·学习
zzzsde2 小时前
【Linux】初识Linux
linux·运维·服务器
大白同学4212 小时前
【C++】C++11介绍(Ⅱ)
开发语言·c++
渡我白衣2 小时前
Linux网络:应用层协议http
linux·网络·http
油炸自行车2 小时前
【Qt】编写Qt自定义Ui控件步骤
开发语言·c++·qt·ui·自定义ui控件·qt4 自定义ui控件
pofenx2 小时前
使用nps创建隧道,进行内网穿透
linux·网络·内网穿透·nps