使用PHP int的开销是多少?

时间:2011-05-12 00:45:17

标签: php size int

我一直听说PHP有开销。例如,C ++ int在32位系统上使用4字节,但PHP int使用更多。这个值是什么?

2 个答案:

答案 0 :(得分:8)

我需要更多的空间而不是评论来扩展马里奥的发现,所以我会添加一个答案。

C union的大小将是其最大成员的大小(可能需要额外的字节来满足对齐约束)。为zvalue_value,这将是obj,其具有三个指针(不包括什么这些指针指向所需的存储器)大小:

typedef struct _zend_object {
    zend_class_entry *ce;
    HashTable *properties;
    HashTable *guards; /* protects from __get/__set ... recursion */
} zend_object;

在32位系统上,zend_object将占用24个字节,而在64位系统上则占用48个字节。因此,无论您在其中存储什么数据,每个zvalue_value至少需要24或48个字节。还有变量的名称,它消耗更多的内存;编译语言通常丢弃一旦编译完成的名称和治疗值作为字节简单序列(因此double需要八个字节,一个char需要一个字节,等等...)。

通过问候你最近关于PHP布尔值,一个简单的布尔值将消耗24个或48字节的值,加上名称的几个字节,加上四个或八个为zend_unit,加上四个问题(或八个)这两个zend_uchar

struct _zval_struct {
    /* Variable information */
    zvalue_value value;     /* value */
    zend_uint refcount__gc;
    zend_uchar type;    /* active type */
    zend_uchar is_ref__gc;
};

zend_uchar的成员将咀嚼了四个(或八个)字节由于对齐约束,几乎每个CPU希望在自然地址边界访问存储器,这意味着,一个单一的字节大小的部件上的{{1}将占用四个字节或八个字节的内存(取决于CPU的自然字大小和对齐约束)。因此,布尔值将占用36到72个字节的内存。

答案 1 :(得分:7)

PHP不仅存储C int。它需要保存每个值的类型信息和诸如此类的东西。每个变量还需要一个变量范围哈希表中的条目。

不确定这是否是正确的代码段,但基本上在PHP源代码中查找zval

struct _zval_struct {
        /* Variable information */
        zvalue_value value;             /* value */
        zend_uint refcount__gc;
        zend_uchar type;        /* active type */
        zend_uchar is_ref__gc;
};

typedef union _zvalue_value {
        long lval;                                      /* long value */
        double dval;                            /* double value */
        struct {
                char *val;
                int len;
        } str;
        HashTable *ht;                          /* hash table value */
        zend_object_value obj;
} zvalue_value;

大多数类似整数的类型至少使用long。 (我假设其中包括您之前提问的布尔值。)

http://porteightyeight.com/2008/03/18/the-truth-about-php-variables/