기술적 한계에 도달하고 싶다면 학습 과정은 무슨 일이 일어나고 있고 왜 일어나는지 아는 것입니다. 오늘 우리는 PHP의 기본 쓰기 중 복사(쓰기 중 분할이라고도 함)에 대해 논의하겠습니다. 먼저 코드 일부를 살펴보겠습니다. 두 코드 조각의 출력 결과는 모두가 알고 있을 것입니다. 하지만 오늘은 무슨 일이 일어났는지에 대해 이야기하겠습니다. 아래 그림은 PHP 저장변수의 구조입니다(설명의 편의를 위해 주석을 달았습니다). zend.h는 Zend 디렉터리에 있습니다. 보시다시피 구조는 변수 값을 저장하고 여러 변수는"/> 기술적 한계에 도달하고 싶다면 학습 과정은 무슨 일이 일어나고 있고 왜 일어나는지 아는 것입니다. 오늘 우리는 PHP의 기본 쓰기 중 복사(쓰기 중 분할이라고도 함)에 대해 논의하겠습니다. 먼저 코드 일부를 살펴보겠습니다. 두 코드 조각의 출력 결과는 모두가 알고 있을 것입니다. 하지만 오늘은 무슨 일이 일어났는지에 대해 이야기하겠습니다. 아래 그림은 PHP 저장변수의 구조입니다(설명의 편의를 위해 주석을 달았습니다). zend.h는 Zend 디렉터리에 있습니다. 보시다시피 구조는 변수 값을 저장하고 여러 변수는">

>백엔드 개발 >PHP 튜토리얼 >PHP 기본 분석 : Shengcai Forum ww7349cow 일본 소 젖돌 작성 시 소 소의 복수형 복사에 대해

PHP 기본 분석 : Shengcai Forum ww7349cow 일본 소 젖돌 작성 시 소 소의 복수형 복사에 대해

WBOY
WBOY원래의
2016-07-29 08:53:493977검색

기술적 한계에 도달하고 싶다면 현재 일어나고 있는 일과 그 이유를 아는 것이 학습 과정입니다.

오늘은 PHP의 기본 쓰기 중 복사(쓰기 중 분할이라고도 함)에 대해 논의하겠습니다.

먼저 코드를 살펴보겠습니다.
PHP 기본 분석 : Shengcai Forum ww7349cow 일본 소 젖돌 작성 시 소 소의 복수형 복사에 대해

두 코드의 출력 결과는 모두가 알고 있겠지만 오늘은 무슨 일이에요.

아래 그림은 PHP 저장변수의 구조입니다. (설명의 편의를 위해 주석을 가미했습니다.) Zend 디렉토리에 zend.h가 있습니다.

보시다시피 구조체에는 변수 값에 대한 정보, 구조체를 가리키는 변수 개수, 변수 유형, 참조 변수인지 등에 대한 정보가 저장됩니다.
PHP 기본 분석 : Shengcai Forum ww7349cow 일본 소 젖돌 작성 시 소 소의 복수형 복사에 대해

그럼 첫 번째 인쇄는 어떻게 되나요? 변수정보는 구조체에 들어가며 상관관계는 다음과 같습니다.
PHP 기본 분석 : Shengcai Forum ww7349cow 일본 소 젖돌 작성 시 소 소의 복수형 복사에 대해

$name = '저녁 8시 30분';
$myName = $name;

이것은 $name과 $myName이 구조를 공유할 때 refcount__gc는 2입니다.

이 프로세스에서 $myName = $name이 적극적으로 두 구조가 되지 않음을 발견했습니다(이 역시 내부 구현으로 간주됩니다). PHP의 일종의 최적화로, 하나의 구조만 사용하여 메모리를 절약합니다.

그럼 $myName = 'gzchen';으로 코드가 실행되면 구조는 어떻게 변경되나요? 첫 번째 출력에서는 두 개의 변수가 구조를 공유하고 있기 때문에 이때 변수 중 하나를 변경하면 두 값이 함께 변경되는 걸까요? 순전히 구조의 논리로만 보면, 결국 모든 사람이 이 구조를 공유하는 것이 가능합니다.

그럼 두 번째 인쇄에서는 어떤 일이 발생하는지 살펴보겠습니다.
PHP 기본 분석 : Shengcai Forum ww7349cow 일본 소 젖돌 작성 시 소 소의 복수형 복사에 대해

$name과 $myName은 동시에 변경되지 않습니다. 'gzchen'으로 변경하되, 두 구조는 각각 $name 및 $myName에 해당합니다.

이것은 COW(기록 중 복사)로 인해 $myName = $name이 할당되면 두 개의 구조로 분할되지 않지만 그 중 하나를 다시 쓰면 효과가 발생합니다. 일종의 느린 복제(느린 분할이라고도 함)가 사용됩니다.

의사 코드는 다음과 같습니다.
PHP 기본 분석 : Shengcai Forum ww7349cow 일본 소 젖돌 작성 시 소 소의 복수형 복사에 대해

다른 코드를 살펴보겠습니다.
PHP 기본 분석 : Shengcai Forum ww7349cow 일본 소 젖돌 작성 시 소 소의 복수형 복사에 대해

출력은 'b ', 중간에 일어나는 일 무엇?

실제로 foreach 순회 프로세스 중에 $arr(원래 배열)은 직접 조작되지 않지만 $arr는 $arrcopy에 복사됩니다(실제로는 복사본이므로 대신 $arrcopy를 사용합니다). , foreach는 순회 과정에서 항상 $arrcopy를 수행합니다. 일반적인 프로세스는 다음과 같습니다.

PHP 기본 분석 : Shengcai Forum ww7349cow 일본 소 젖돌 작성 시 소 소의 복수형 복사에 대해

실제로는 위의 예제와 동일하다는 것을 알 수 있습니다. 시작 부분($arr = $arrcopy)은 여전히 ​​구조를 공유했지만 $arr[$k] = $v가 다시 할당되고 쓰기 중 복사가 발생하여 구조가 분할되었습니다.

앞서 언급했듯이 foreach는 $arrcopy를 수행하므로 $arr의 구조 포인터가 첫 번째 위치에 고정됩니다(구조가 다르기 때문에 $arrcopy는 $arr에 동기적으로 값을 할당할 수 없습니다.).

사실 이런 기술은 보통 인터뷰에서만 쓰인다. 결국 일상적인 전개에서 이런 글쓰기 방식을 사용하는 친구들은 당분간 돈이 아니다. '글을 쓰면서 복사하기'가 있다는 것만 알아두면 된다.

위 내용은 PHP의 기본 분석을 소개합니다. 소 및 PHP 내용을 포함하여 글을 작성할 때 소를 복사하는 것과 관련하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.