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

相关推荐
.YM.Z6 分钟前
C++——【红黑树】原理详解:定义、性质、插入变色与旋转实现
开发语言·c++
~光~~35 分钟前
【嵌入式linux学习】Cache 策略:Write-Through / Write-Back + Allocation
linux·学习·spring
峥无40 分钟前
Linux NPTL线程:创建/终止/等待/分离/栈布局内核原理|线程下篇
linux·运维·线程
无名猿1 小时前
constexpr 能力扩张:从 C++11 到 C++20 的编译期计算
c++·性能优化·现代c++·编译期
007张三丰1 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·c语言·c++·内存管理
是jin奥2 小时前
Ubuntu 访问 Windows 共享目录
linux·运维·ubuntu
三月微暖寻春笋2 小时前
【和春笋一起学C++】(七十二)类模板
开发语言·c++·实例·类模板·使用类模板·数组模板
xlq223222 小时前
全面复习4
c++
星恒随风2 小时前
Linux基础IO万字详解:从文件描述符fd到重定向、FILE缓冲机制及MiniShell升级
linux·运维·笔记·学习·状态模式
殷色玫瑰2 小时前
C++ STL:map 与 set 详解——从底层红黑树到实际应用
c语言·数据结构·c++·算法·visualstudio·rpc