通过地址偏移量访问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;}
- 通过地址偏移量访问C++结构体数据成员
- 计算结构体成员地址偏移量...
- 结构体成员偏移量
- c语言 获取结构体成员偏移量方法
- 结构体成员偏移地址
- 求结构体成员的偏移量
- 结构体成员偏移量的计算
- 结构体中成员变量偏移量
- 计算结构体成员偏移量
- 计算结构体成员偏移量
- ANSI C中获取结构体成员偏移量量的办法
- 通过偏移量来访问C++类数据成员实验
- C编译器剖析_5.2.3 中间代码生成及优化_通过“偏移”访问数组元素和结构体成员
- 结构体成员偏移量,标准C其实有定义宏实现
- 如何求出C语言结构体中各个成员的大小及内存偏移量
- [C/C++标准库]_[初级]_[计算结构体成员的偏移量]
- 如何确定域在结构中的字节偏移量,怎样用结构成员名访问对应成员?
- 使用宏定义来获取一个结构体成员相对于该结构体首地址的偏移量
- hjhj
- Delphi的消息机制探索-第一部分:流程概述(转)
- [oracle] SQLPlus 如何查看引用游标中的结果集
- 代理模式
- zoj 2906 || poj 3449 Geometric Shapes
- 通过地址偏移量访问C++结构体数据成员
- JRTPLIB 3.5.2手册中文版---part14
- android 资料
- 杂谈ThreadLocal
- 超时任务总结(tradingTask)
- Autoconf和Automake,自动生成Makefile
- 个人学习到的测试原则和理念
- iphone开发每日一练【2011-08-28】
- 我的emacs设置,从史上最牛的emacs设置改过来的.