1.验证当前电脑执行malloc申请内存方式
#include<stdio.h>
#include<mallic.h>
int main()
{
void* ptr = malloc(8);
return 1;
}
p *ptr 不能打出,因为是void(*)
linux 2.6以上不是此方式。
2.结构体不对齐
局部也是最小单位对齐;
加__attribute__((__packed__)) ,内存不对齐
struct __attribute__((__packed__)) s{
char a; //1
int b; //4
long c; //8
void* d; //8
int e; //4
char* f; //8
}s;
s.a = 'a';
s.b = 1;
s.c = 2;
s.d = NULL;
s.e = 3;
s.f = &s.a;
printf("size of struct s is %d\n", sizeof(s));
return 1;
// 输出结构为size of struct s is 33
3.宏定义 替换
#define _BIN_DATA_SIZE(num, size, elements, pages, x, y) size
static const uint32_t bin_data_size[] = {
ZEND_MM_BINS_INFO(_BIN_DATA_SIZE, x, y)
};
#define ZEND_MM_BINS_INFO(_, x, y) \
_( 0, 8, 512, 1, x, y) \
_( 1, 16, 256, 1, x, y) \
...
_(28, 2560, 8, 5, x, y) \
_(29, 3072, 4, 3, x, y)
对以上代码的简单理解
- ZEND_MM_BINS_INFO(_BIN_DATA_SIZE, x, y)经过替换为:
static const uint32_t bin_data_size[] = {
_BIN_DATA_SIZE( 0, 8, 512, 1, x, y) \
_BIN_DATA_SIZE( 1, 16, 256, 1, x, y) \
...
_BIN_DATA_SIZE(28, 2560, 8, 5, x, y) \
_BIN_DATA_SIZE(29, 3072, 4, 3, x, y)
};
- _BIN_DATA_SIZE经过替换为:
static const uint32_t bin_data_size[] = {
8,\
16,\
...
2560,\
3072,
};
- \表示同一行故结果为:
static const uint32_t bin_data_size[] = {
8,16, ...2560,3072,
};
4.数组hashtable
key经过hash就算存在模中,如有冲突,头部拉链法解决。
5.数组
头部gc中冗余了type
数字数组索引-2,字符索引跟大小相关
6.运算
- -2 用unit32表示结果为2^32-2 ,负数转成正数要取补码(位置取反+1),过程如下
说明 | 符号位 | 2^31 | 2^30 | 2^29 | 2^28 | … | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |
-2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
位置取反 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | |
+1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
- unit32的范围【正0~2^31-1】【(2^31-1)~-1】
- 1|-8 结果为-7
说明 | 符号位 | 2^3 | 2^2 | 2^1 | 2^0 |
-8 | 1 | 1 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 0 | 1 |
或运算 | 1 | 1 | 0 | 0 | 1 |
结果为负,符号位不变,其他取补码 | 1 | 0 | 1 | 1 | 1 |
7.笔记地址