我需要更多的空间而不是评论来扩展马里奥的发现,所以我会添加一个答案.
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不只是存储的Ç 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/