PHP符号表:引用修改数组后计数归1,标量类型是否有此现象?
问题解答
这种修改对象内容后触发新对象分配、原对象引用计数被设为1的情况,不会发生在整数、浮点数、字符串、布尔值这类标量原生类型上,仅针对数组这类支持写时复制的可变复合类型。
具体原因:
标量原生类型的不可变性
整数、浮点数、字符串、布尔值都是不可变类型——你根本没办法修改一个已存在的标量对象的内部内容。比如你不能把整数5改成6,也不能把字符串"hello"的某个字符替换掉。所有看似“修改”的操作,本质都是让变量指向一个全新的标量对象:x = 10 y = x # x和y指向同一个整数10,引用计数为2 x = 20 # 不是修改10,而是x指向新的整数20,原10的引用计数减为1这里没有修改原对象的操作,自然不会触发新对象的复制分配,也就不会出现原对象引用计数被重置为1的情况。
数组这类可变复合类型的写时复制机制
像数组这类可变复合类型,很多语言会采用**写时复制(Copy-on-Write)**优化:当多个引用指向同一个数组时,读取操作会共享同一个内存对象;但当你尝试修改数组的元素时,语言会先复制出一个全新的数组,让当前执行修改的引用指向这个新数组,原数组的引用计数则会减1(如果之前是2,就会变成1)。这就是你描述的“修改操作后分配新数组,引用计数设为1”的场景。
内容的提问来源于stack exchange,提问作者Carlos Alberto Lopez
相关产品推荐
相关产品推荐

