通过地址偏移量访问C++结构体数据成员

本文介绍了一种利用C++模板结合成员变量偏移量的方法,该方法允许客户代码直接修改内存对象的特定属性而无需获取整个对象,从而提高了操作效率。文章通过示例代码展示了如何实现这一功能。

       通过偏移量访问成员变量配合C++模板函数。客户代码可以很方便的修改内存对象的数据,不需获取整个对象就可以灵活修改任一属性,相比先获取整个对象修改其中的属性再将整个对象替换的方式提高了效率。

 
示例代码:

#include "stdafx.h"

#include <string>
#include <list>
#include <map>

//获取结构体偏移量宏定义
#define  GetAttrOffSet(CLASSTYPE, Attr)  (size_t)(&((CLASSTYPE*)0x000)->Attr)

//内存模型对象
class CNode
{
public:
	int m_iAttrOne;
	std::string m_strAttrTwo;
	std::list<int> m_lstAttrThree;
	std::map<int, std::list<int> > m_mapAttrFour;
};

//对象管理器
class CNodeMgr
{
public:
	template<class Type>
	void ModifyNodeAttr(const Type& attr, const int iNodeID, const size_t offset)
	{
		//此处略去m_mapNode中找不到iNodeID的异常情况处理
		*((Type*)((size_t)m_mapNode[iNodeID] + offset)) = attr;
	}

	template<class Type>
	const Type& GetNodeAttr(const int iNodeID, const size_t offset)
	{
		//此处略去m_mapNode中找不到iNodeID的异常情况处理
		return *((Type*)((size_t)m_mapNode[iNodeID] + offset)); 
	}

	CNodeMgr()
	{
		m_mapNode[1] = new CNode;
		m_mapNode[2] = new CNode;
		m_mapNode[3] = new CNode;
	}

private:
	std::map<int, CNode*> m_mapNode;
};


int _tmain(int argc, _TCHAR* argv[])
{
	//修改Key值为2的Node对象属性
	CNodeMgr nodeMgr;
	nodeMgr.ModifyNodeAttr((int)1, 2, GetAttrOffSet(CNode, m_iAttrOne));
	nodeMgr.ModifyNodeAttr(std::string("abc"), 2, GetAttrOffSet(CNode, m_strAttrTwo));

	std::list<int> lstAttr;
	lstAttr.push_back(1);
	lstAttr.push_back(2);
	lstAttr.push_back(3);
	nodeMgr.ModifyNodeAttr(lstAttr, 2, GetAttrOffSet(CNode, m_lstAttrThree));

	std::map<int, std::list<int> > mapAttr;
	mapAttr[1] = lstAttr;
	mapAttr[2] = lstAttr;
	nodeMgr.ModifyNodeAttr(mapAttr, 2, GetAttrOffSet(CNode, m_mapAttrFour));

	//获取Key值为2的Node属性
	lstAttr = nodeMgr.GetNodeAttr<std::list<int>>(2, GetAttrOffSet(CNode, m_lstAttrThree));

	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值