char* 与 自定义类型 做差 的区别

来源:互联网 发布:java多线程并发控制 编辑:程序博客网 时间:2024/05/22 17:12

typedef struct __BlockNode {
    __BlockNode* next;
    __BlockNode():next(NULL){};
}BlockNode;


一、正确的方法

BlockNode* node = (BlockNode*)((char*)pool + (m_nTotalNum - 1) * m_nElementSize);
for (int i = 0; i < (m_nTotalNum - 1); ++i) {
node->next = m_pHeader;
m_pHeader = node;
node = (BlockNode*)((char*)node - m_nElementSize);
}


Cocos2d: size : 131076.

Cocos2d: size BlockNode : 4.
Cocos2d: [MemPool] make pool create 6Buffer, size 131080, num 25, total 3277000, times 1.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 284012720.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283881640.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283750560.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283619480.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283488400.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283357320.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283226240.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 283095160.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282964080.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282833000.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282701920.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282570840.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282439760.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282308680.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282177600.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 282046520.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281915440.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281784360.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281653280.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281522200.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281391120.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281260040.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 281128960.
Cocos2d: ========= 1 : (char*)node - m_nElementSize = 280997880.

282833000 - 282701920 = 131080
281653280 - 281522200 = 131080


二、错误的方法

BlockNode* node = (BlockNode*)((char*)pool + (m_nTotalNum - 1) * m_nElementSize);
for (int i = 0; i < (m_nTotalNum - 1); ++i) {
node->next = m_pHeader;
m_pHeader = node;
node = (BlockNode*)(node - m_nElementSize);
}


Cocos2d: size : 131076.
Cocos2d: size BlockNode : 4.
Cocos2d: [MemPool] make pool create 6Buffer, size 131080, num 25, total 3277000, times 1.
Cocos2d: ========= 1 : node - m_nElementSize = 298864768.
Cocos2d: ========= 1 : node - m_nElementSize = 298340448.
Cocos2d: ========= 1 : node - m_nElementSize = 297816128.
Cocos2d: ========= 1 : node - m_nElementSize = 297291808.
Cocos2d: ========= 1 : node - m_nElementSize = 296767488.
Cocos2d: ========= 1 : node - m_nElementSize = 296243168.
Cocos2d: ========= 1 : node - m_nElementSize = 295718848.
// 这里已经挂掉

298864768 - 298340448
297291808 - 296767488 = 524320
298340448 - 297816128 = 524320


关键点:524320 / 131080 = 4 后者是前者的四倍


如果,直接使用 m_pHeader 做差值,地址偏移不是一般的大。导致程序直接崩溃了。

两者的区别在于,前者 是cha*型 指向的对象大小为一字节(这个很重要, 移动的位置的大小, 和这指针指向的实际的元素有关,此时它指向一个char型数据,所以sizeof(char) = 1), 后者为BlockNode*型指向的对象大小为4字节(sizeof(BlockNode) = 4)
所以在做减法的时候,前者 向前移动了 1 * m_nElementSize 个位置,而后者向前移动了 4 * m_nElementSize 个位置。

而我在malloc内存时,是以字节为单位生成内存的,在使用的时候,也应当通过字节来控制分配块的位置,否则以4倍的速度分配,就会像后者,提前走完分配的空间,直接野指针,程序挂掉。



原创粉丝点击