本帖最后由 duanchengfeng 于 2013-02-18 15:04:54 编辑

解决方案 »

  1.   

    请版主回答得详细点,小弟初学者,php的数组是在堆中还是在栈中
      

  2.   

    PHP中怎么会无堆无栈呢???所有程序都是在内存中玩的。在内存中那么就会有地址的分配了。PHP中基本数据类型是放在栈区,而复合数据类型是放在堆区的。数组是复合数据类型,所以是放在堆区。
      

  3.   

    php中所有变量都是由叫zval的结构体实现
    数组变量创建之后,产生一个zval结构体,其中value存放变量值,type标志变量的类型
    typedef struct _zval_struct zval; 
    struct _zval_struct {  
        zvalue_value value; /* value */  
        unsigned char type; /* active type */  
        unsigned char is_ref;  
        short refcount;  
    };
    value元素是一个_zvalue_value的联合体
    typedef union _zvalue_value {  
        long lval; /* long value */  
        double dval; /* double value */  
        struct {  
            char *val;  
            int len;  
        } str;  
        HashTable *ht; /* hash table value */  
        struct {  
            zend_class_entry *ce;  
            HashTable *properties;  
        } obj;  
    } zvalue_value;
    如果变量类型是数组,那么数组值变存放在_zvalue_value的*ht中,这是一个HashTable结构体
    typedef struct _hashtable {
        uint nTableSize;  
        uint nTableMask;  
        uint nNumOfElements;  
        ulong nNextFreeElement;  
        Bucket *pInternalPointer;   /* Used for element traversal */ 
        Bucket *pListHead;  
        Bucket *pListTail;  
        Bucket **arBuckets;            
        dtor_func_t pDestructor;  
        zend_bool persistent;  
        unsigned char nApplyCount;  
        zend_bool bApplyProtection;  
    #if ZEND_DEBUG  
        int inconsistent;  
    #endif  
    } HashTable; 其中bucket是一个双向链表,用来存放数组的每个元素
    typedef struct bucket {  
        ulong h;                        /* Used for numeric indexing */ 
        uint nKeyLength;  
        void *pData;  
        void *pDataPtr;  
        struct bucket *pListNext;  
        struct bucket *pListLast;  
        struct bucket *pNext;  
        struct bucket *pLast;  
        char *arKey;  
    } Bucket;
      

  4.   

    楼上两位有点自作多情了
    楼主问的是php,而不是实现php伪处理器的c++
    如果学习php需要研究其底层实现的话,那么是否使用C++也需要精通汇编呢?
    如果哪天php用java重写,是否也需要也去学习java呢?
      

  5.   


    你可以这样简单的理解。  栈区是值传递, 堆区是引用传递。 就是指针
    PHP的数组是在栈区。   传值是值传递
    JS的数组是存在堆区。  传值是引用传递。