我一直听说PHP有开销。 例如,C++ int 在 32 位系统上使用 4 个字节,但 PHP int 使用更多字节。 这个值是多少?
我需要比评论更多的空间来扩展马里奥的发现,所以我会添加一个答案。
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 都希望访问自然地址边界上的内存,这意味着struct
的单个字节大小的成员将占用四个字节或八个字节的内存(取决于 CPU 的自然字大小和对齐约束)。因此,布尔值将占用 36 到 72 字节的内存。
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/