php源码学习d8 知识回顾补充

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^312^302^292^282^52^42^32^22^12^0
-2100000000010
位置取反 11111111101
+1 11111111110
  • unit32的范围【正0~2^31-1】【(2^31-1)~-1】
  •  1|-8 结果为-7
说明符号位2^32^22^12^0
-811000
100001
或运算11001
结果为负,符号位不变,其他取补码10111

7.笔记地址

d8 知识补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值