我一直听说PHP有开销。例如,C ++ int在32位系统上使用4字节,但PHP int使用更多。这个值是什么?
答案 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/