任意字节对齐的内存分配和释放。
源码实现
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
代码解析
void *data;这个类型是一个指针类型,sizeof(data)是4个字节,但是data++并不是移动4个字节,因为data是一个void *型,没有明确说明指向哪种类型,如果int *data;data++则是移动4个字节,所以这里需要转换为二级指针,二级指针是指向一级指针的,而一级指针是内存地址,而32位系统中一级指针是32位,也就是4个字节,所以,这种情况下二级指针实际上指向一个32位的类型变量的指针(64为系统中,二级指针类似于指向一个64位类型变量的指针),所以你移动二级指针,如果是32位系统,就是移动4个字节,如果是64位系统,就是移动8个字节。
这里以32位系统,16字节对齐为例,用示意图表示更加清楚一点。
原始分配内存图
下面考虑两种情况:
这里要注意转为二级指针后:
1. 指向的内存区域是指针变量,存放的是地址,即编译器对内存的解析发生变化
2. 对void **进行自增++,移动的是一个指针变量的大小