【问题标题】:will php copy value when I assign value?当我分配值时,php会复制值吗?
【发布时间】:2016-06-13 16:39:24
【问题描述】:

我看到很多这样的代码:

function load_items(&$items_arr) {
    // ... some code
}

load_items($item_arr);
$v = &$items_arr[$id];

对比代码如下:

function load_items() {
    // ... some code
    return $items_arr;
}

$item_arr = load_items();
$v = $items_arr[$id];

第二个代码是否会复制items_arr$item_arr[$id] 第一个代码导入性能好吗?

【问题讨论】:

  • .......什么?
  • @dbf 我只是听别人说,我觉得这太不可思议了
  • 你的问题不是很清楚,至少可以这么说。通过在变量前面加上&符号&,您通过引用将其传递给函数,变量需要首先定义,然后由您的函数修改
  • @aron9forever - 不,你可以返回任何东西,因为该语言基本上复制了C,但他们没有让它返回一个数组,只返回最常见的数据结构和 PHP 流行的原因. </sarcasm>
  • @roger - 不,不要始终使用&。这样做不会使您的程序更快或更慢,但您可能会遇到意外行为。 PHP 足够聪明,不会将整个数组按值传递给函数,您不必为此使用&。此复制将在修改您传递的数据时发生,对象除外。 Read this answer please 不要无缘无故做你想做的傻事。

标签: php


【解决方案1】:

不,它不会立即复制该值。写时复制 是 PHP 中使用的内存管理方法之一。它确保在变量之间复制值时不会浪费内存。 这意味着当您分配时:

$v = $items_arr[$id];

PHP 将简单地更新符号表以指示$v 指向与$item_arr[$id] 相同的内存地址,只要您之后更改$item_arr$v,PHP 就会分配更多内存然后执行复制。

通过延迟这种额外的内存分配和复制 PHP 在某些情况下可以节省时间和内存。

有一篇关于 PHP 内存管理的好文章:http://hengrui-li.blogspot.no/2011/08/php-copy-on-write-how-php-manages.html

【讨论】:

    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 2012-10-17
    • 2015-03-19
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多