php内核为变量的值分配内存的几个宏

在php5.3之前,为某变量分配内存是用宏 MAKE_STD_ZVAL;

737 #define MAKE_STD_ZVAL(zv) \   # /Zend/zend.h
738 ALLOC_ZVAL(zv); \
739 INIT_PZVAL(zv);

165 #define ALLOC_ZVAL(z) \      # /Zend/zend_alloc.h
166 (z) = (zval *) emalloc(sizeof(zval))

727 #define INIT_PZVAL(z) \              # /Zend/zend.h
728 (z)->refcount__gc = 1; \
729 (z)->is_ref__gc = 0;

php5.3以及php5.4之后 还是用宏 MAKE_STD_ZVAL; 但是  ALLOC_ZVAL 里面有了新的实现,是因为php5.3新的GC(垃圾回收机制)

#undef 是在后面取消以前定义的宏定义

/* The following macroses override macroses from zend_alloc.h */
203 #undef ALLOC_ZVAL
204 #define ALLOC_ZVAL(z) \
205 do { \
206 (z) = (zval*)emalloc(sizeof(zval_gc_info)); \
207 GC_ZVAL_INIT(z); \
208 } while (0)

63 #define GC_ZVAL_INIT(z) \
64 ((zval_gc_info*)(z))->u.buffered = NULL

至于为什么这样做,在 php5.3新的垃圾回收机制详解 中有详细的介绍

php内核为变量的值分配内存的几个宏,布布扣,bubuko.com

时间: 2024-10-11 00:14:48

php内核为变量的值分配内存的几个宏的相关文章

【编程题】不引入第三个变量,而交换两个变量的值

不引入第三个变量,而交换两个变量的值 方法一:算术运算 1 int a,b; 2 a=10;b=12; 3 a=b-a; //a=2;b=12 4 b=b-a; //a=2;b=10 5 a=a+b; //a=12;b=10 它的原理:把a,b看做数轴上的两个点. 第一句"a=b-a"求出了ab两点之间的距离,并且将其保存在a中: 第二句"b=b-a"求出了a到原点的距离(b到原点的距离减去ab两点距离),并且将其保存在b中: 第三句"a=b+a"

linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】

转自:http://blog.csdn.net/goodluckwhh/article/details/9005585 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一每CPU变量 二原子操作 三优化和内存屏障 四自旋锁 自旋锁 自旋锁的数据结构和宏函数 读写自旋锁 读写自旋锁的相关函数 linux内核中的各种“任务”都能看到内核地址空间,因而它们之间也需要同步和互斥.linux内核支持的同步/互斥手段包括: 技术 功能 作用范围 每CPU变量 为每个CPU复制一份数据

.NET的堆和栈01,基本概念、值类型内存分配

当我们对.NET Framework的一些基本面了解之后,实际上,还是很有必要了解一些更底层的知识.比如.NET Framework是如何进行内存管理的,是如何垃圾回收的......这样,我们才能写出更高性能的程序. 在.NET Framework中,有2个地方帮我们保存管理数据:一个是"堆",也叫"托管堆",由.NET Framework的垃圾收集器(Garbage Collection, GC)管理:另一个是"栈",也叫"线程堆栈&

变量、作用域和内存问题 - 基本类型和用类型的值

基本类型和引用类型的值 ECMAScript变量可能包含两种不同的数据类型的值:基本类型和引用类型值. 基本类型值指得是简单的数据段,而引用类型值指那些可能由多个值构成的对象. 在将一个值赋给变量的时,解析器必须确定这个值是基本类型值还是引用类型值.其中5种基本数据类型:Undefined.Null.Boolean.Number.String.这5种基本数据类型是按值访问的,因此可以操作保存在变量中的实际的值. 引用类型的值是保存在内存中的对象.与其他语言不同,javascript不允许直接访问

变量声明有没有分配内存?

Q1: int i 这个有没有分配内存呢? int *p 呢? 具体是在栈空间还是在堆空间里分配内存呢? ? A1: int i; int *p; 这两个都在栈区分配了内存空间 但是p指向的地址为野地址,不可直接拿来使用 即p指向的空间没有分配 ? Q2:在Java中定义数组时必须分配内存,这句话是错的还是对的呢 ? A2: Java中的数组你可以看到一个特殊的对象,声明时是放在栈中的,分配的空间存储在堆中 如: 1. int[] arr = null; 此时只是在栈中声明了一个 arr 数组,

把握linux内核设计(十一):内存管理之页的分配与回收

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 内存管理单元(MMU)负责将管理内存,在把虚拟地址转换为物理地址的硬件的时候是按页为单位进行处理,从虚拟内存的角度来看,页就是内存管理中的最小单位.页的大小与体系结构有关,在 x86 结构中一般是4KB(32位)或者8KB(64位). 通过 getconf 命令可以查看系统的page的大小: # getconf -a | grep PAGE PAGESIZE 4096 PAG

内存在静态变量区分配内存

内存:1:堆存储区 ==> 存储手动分配的内存:malloc free 2:栈存储区 ==> 系统为临时变量分配内存的区域 3:静态变量存储区 ==> 用来存储静态变量内存 当程序启动时,先为所有的静态变量分配内存 在程序执行中,static静态变量的内存一直保留 当程序完全结束时,系统才释放所有的static变量

关于指针 用字符数组,字符指针变量输入字符串 动态为字符型指针变量分配内存

#include <stdio.h> #include <iostream> #include<math.h> using namespace std; int main() { //声明字符型数组和指针变量 char str[10]; char *strip=str; //输入输出 cout<<"str="; cin>>str; //用字符数组输入字符串 cout<<"str="<<

分配内存(Linux设备驱动程序)

分配内存 介绍设备驱动程序中使用内存的方法: 如何最好地利用系统内存资源. kmalloc函数 kmalloc内存分配引擎是一个功能强大的工具. #include <linux/slab.h> void *kmalloc(size_t size, int flags); 参数分配表示flags能够以多种方式控制kmalloc的行为. 标志GFP_KERNEL表示内存分配是代表运行在内核空间的进程执行的,这意味着调用它的函数正代表 某个进程执行系统调用. 使用GFP_KERNEL允许kmallo