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

来源:互联网 发布:nginx keepalive 编辑:程序博客网 时间:2024/05/17 08:16

       通过偏移量访问成员变量配合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;}


 

原创粉丝点击