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

相关推荐
qeen875 分钟前
【算法笔记】二分查找与二分答案
c语言·c++·笔记·学习·算法·二分
脆皮炸鸡75510 分钟前
进程的程序替换
linux·经验分享·笔记·vim·学习方法
Sylvia-girl15 分钟前
类与对象(下)
c++·友元函数·类与对象
Hello eveybody19 分钟前
介绍最大公因数和最小公约数(C++)
java·开发语言·c++
宵时待雨21 分钟前
优选算法专题3:二分查找
数据结构·c++·算法·leetcode·职场和发展
Byte不洛22 分钟前
理解C++异常机制:栈展开、异常传播与异常安全
c++·异常处理·后端开发·编程基础·try catch
划水的code搬运工小李24 分钟前
ubuntu下使用opencode
linux·运维·ubuntu
我头发多我先学25 分钟前
C++ AVL 树:平衡原理到完整实现(自平衡二叉搜索树)
开发语言·数据结构·c++·算法
啊我不会诶26 分钟前
2025浙江省赛补题
c++·算法
ZPC821031 分钟前
Ubuntu 实时性优化(专属定制版,适配 fast_shm 通信)
linux·数据库·postgresql