共享智能指针在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时多了两次复制构造函数调用,增加数据拷贝的开销

相关推荐
派阿喵搞电子1 小时前
在UI界面内修改了对象名,在#include “ui_mainwindow.h“没更新
c++·qt·ubuntu·ui
C++ 老炮儿的技术栈2 小时前
UDP 与 TCP 的区别是什么?
开发语言·c++·windows·算法·visual studio
mochensage4 小时前
CSP信奥赛C++常用系统函数汇总
c++·信奥
mochensage4 小时前
C++信息学竞赛中常用函数的一般用法
java·c++·算法
fpcc4 小时前
跟我学c++中级篇——多线程中的文件处理
c++
地衣君4 小时前
RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程
linux·ubuntu·risc-v
5:005 小时前
云备份项目
linux·开发语言·c++
码农101号5 小时前
Linux中shell编程表达式和数组讲解
linux·运维·服务器
乄夜5 小时前
嵌入式面试高频(5)!!!C++语言(嵌入式八股文,嵌入式面经)
c语言·c++·单片机·嵌入式硬件·物联网·面试·职场和发展
云道轩5 小时前
升级centos 7.9内核到 5.4.x
linux·运维·centos