offsetof的意义

offsetof是求类的成员变量的偏移量,如果成员变量是类定义的第一个变量,那他的偏移量应该是0.但是引入继承之后,就要额外考虑了。下面的代码说明了这个问题:

#define AFX_NOVTABLE
//#define AFX_NOVTABLE __declspec(novtable)

class AFX_NOVTABLE CNoTrackObject
{
public:
    void* PASCAL operator new(size_t nSize);
    void PASCAL operator delete(void*);
    
    virtual ~CNoTrackObject() { }
};

void* PASCAL CNoTrackObject::operator new(size_t nSize)
{
    void* p = ::LocalAlloc(LPTR, nSize);
//     if (p == NULL)
//         AfxThrowMemoryException();
    return p;
}

void PASCAL CNoTrackObject::operator delete(void* p)
{
    if (p != NULL)
        ::LocalFree(p);
}

struct CThreadData : public CNoTrackObject
{
    CThreadData* pNext; // required to be member of CSimpleList
    int nCount;         // current size of pData
    LPVOID* pData;      // actual thread local data (indexed by nSlot)
};

struct CThreadData2
{
    CThreadData2* pNext;
    int nCount;
    LPVOID* pData;
};


int main(int argc, char* argv[])
{
    int nOffset = offsetof(CThreadData, pNext);
    int nOffset2 = offsetof(CThreadData2, pNext);

    return 0;
}
View Code

nOffset = 4

nOffset2 = 0

这个类以最简单的方式实现了链表的基本功能,有局限性:节点类必须包含pNext成员变量,也就是要专门开辟一块空间。

转载于:https://www.cnblogs.com/licb/p/3912883.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值