使用PHP int的开销是多少?

使用PHP int的开销是多少?,php,size,int,Php,Size,Int,我一直听说PHP有开销。例如,C++ int在32位系统上使用4字节,但是PHP int使用更多。这个值是多少?PHP不仅仅存储Cint。它需要为每个值保留类型信息等等。每个变量还需要一个变量范围哈希表中的条目 不确定这段代码是否正确,但基本上在PHP源代码中查找zval: struct _zval_struct { /* Variable information */ zvalue_value value; /* value */

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

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
。(我想这会包括你前面问题中的布尔值。)


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

C
联合体的大小将是其最大成员的大小(可能有额外的字节以满足对齐约束)。对于
zvalue\u value
,这将是具有三个指针大小的
obj
(不包括这些指针指向的对象所需的内存):

在32位系统上,zend_对象将占用24字节,而在64位系统上则占用48字节。因此,无论存储在其中的数据是什么,每个
zvalue\u值都至少需要24或48个字节。还有消耗更多内存的变量的名称;编译语言通常在编译完成后丢弃名称,并将值视为简单的字节序列(因此
double
需要八个字节,
char
需要一个字节,等等)

关于您最近提出的有关PHP布尔值的问题,一个简单的布尔值将消耗24或48个字节的值,再加上几个字节的名称,再加上四个或八个字节的
zend_单元
,再加上四个(或八个)字节的两个
zend_uchar
s:

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都希望访问自然地址边界上的内存,这意味着
struct
的单个字节大小的成员将占用四个字节或八个字节的内存(取决于CPU的自然字长和对齐约束)。因此,布尔值将占用36到72字节的内存。

PHP就是这样。不要反对:)这太荒谬了。它无法量化。PHP是一种高级语言,其全部目的是让您不必担心这些废话。根据当前的计票情况,我们似乎需要一个0票以上的评论。@Chris:您仍然可以将复选标记移到@mu的答案上。它在技术上更为正确,应该是公认的参考答案。@Tomalak:在正常情况下,您不需要关心像PHP中这样的低级细节。然而,如果你需要分配数万或数十万个变量,你确实需要关注这些事情。此外,即使您不需要了解日常任务,也可以了解您的工具是如何工作的。我知道PHP效率较低,但我不知道效率有多高。谢谢@Chris:Perl、Ruby和Python可能会遇到同样的问题,这四个版本在这个级别上可能几乎相同。Ruby(1.x参考实现,32位)将在单个“值”槽中存储最多30位的整数。它使用高阶位确定值分类(elisp使用类似的整数值技术)。我不确定关于“名字”的废话是什么——它和值有什么关系?@pst:谁的名字废话?我的,PHP的,还是C的?那么你是说这两个额外的位(对于小型Ruby Fixnum)本质上是用来指向Fixnum类的?这就意味着Ruby在用速度换取内存,不是吗?我对Perl内部的经验(主要是通过内联::C争论)表明它们与PHP几乎相同(或者很可能是相反)。所有PHP内存问题的明确答案如下:只需指出(显而易见的)
long
将根据PHP编译的体系结构而有所不同(通常为32位或64位)。
struct _zval_struct {
    /* Variable information */
    zvalue_value value;     /* value */
    zend_uint refcount__gc;
    zend_uchar type;    /* active type */
    zend_uchar is_ref__gc;
};