使用PHP int的开销是多少?

5 php size int

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

mu *_*ort 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;
Run Code Online (Sandbox Code Playgroud)

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

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

struct _zval_struct {
    /* Variable information */
    zvalue_value value;     /* value */
    zend_uint refcount__gc;
    zend_uchar type;    /* active type */
    zend_uchar is_ref__gc;
};
Run Code Online (Sandbox Code Playgroud)

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

  • 所有 PHP 内存问题的明确答案在这里:https://nikic.github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html (2认同)

mar*_*rio 7

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

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

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;
Run Code Online (Sandbox Code Playgroud)

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

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