2009-04-16 3 views
6

필자가 아는 한, 문자열은 Delphi에서 불변입니다.Delphi 문자열은 변경 불가능합니까?

string1 := 'Hello'; 
string1 := string1 + " World"; 

첫 번째 문자열이 파괴되고 새 문자열에 "Hello World"에 대한 참조를 가져 : 나는 종류의 당신이 할 경우 의미 이해합니다.

하지만 코드에서 다른 위치에 동일한 문자열이 있으면 어떻게됩니까?

여러 변수를 식별하기 위해 할당 된 문자열 해시가 있습니다. 예를 들어 "변경"은 해당 속성의 해시 값으로 식별됩니다. 그렇게하면 평등에 대한 "변화"를 확인하는 것이 쉽습니다.

이제는 각 해시가 별도로 계산됩니다 (모든 속성이 고려되지는 않으므로 별도의 인스턴스는 일부 값이 다른 경우에도 동일 할 수 있음).

질문은 어떻게 Delphi가 이러한 문자열을 처리합니까? 해시를 동일한 10 바이트 길이의 문자열로 분리하여 계산하면 무엇을 얻을 수 있습니까? 10 바이트의 두 메모리 블록 또는 동일한 메모리 블록에 대한 두 개의 참조?

설명 : 변경 사항은 데이터베이스에서 읽은 일부 속성으로 구성되며 개별 스레드에 의해 생성됩니다. TChange 클래스에는 일부 값 (전부는 아님)을 기반으로 해시를 계산하여 문자열을 생성하는 GetHash 메서드가 있습니다. 이제 다른 스레드가 변경 사항을 수신하고 이전에 처리 된 변경 사항과 비교하여 동일한 (논리적 인) 변경 사항을 처리하지 않도록해야합니다. 따라서 해시와 별도 인스턴스가 있으므로 서로 다른 두 개의 문자열이 계산됩니다. 문자열에서 128 비트 해시와 같은 것으로 변경하는 것이 실제적인 개선인지 아니면 내 시간을 낭비하는지 확인하려고합니다.

편집 : 델파이 버전은 델파이 7.0

답변

20

델파이 문자열은 copy on write입니다. 문자열을 수정하면 (포인터 트릭이나 비슷한 기술을 사용하지 않고 컴파일러를 속일 수 있음), 동일한 문자열에 대한 다른 참조는 영향을받지 않습니다.

델파이 문자열은 지원되지 않습니다. 두 개의 코드 섹션에서 동일한 문자열을 만들면 동일한 백업 저장소가 공유되지 않으므로 동일한 데이터가 두 번 저장됩니다.

+0

한 번 DLL에서 문자열 조작에 문제가 있었고, 검색 IsMultiThread가 false로 설정되었음을 발견했습니다. System.pas에서 선언되었으며 문자열 참조 계산 및 저장을 수정할 때 사용됩니다. 내 초기화 섹션에서 true로 설정하면 내 문제가 해결되었습니다. –

+0

Stijn - 참조 계산 메커니즘은 멀티 스레드에 안전하도록 버스 잠금 증가 및 감소 지시를 사용합니다. 이것들은 보통 inc와 dec보다 느립니다. IsMultiThread는 Delphi에서 스레드를 생성하여 설정됩니다. 물론 Delphi 외부에서 스레드를 생성하거나 원시 기본 API를 사용하면 알 수 없습니다. –

0

델파이 버전은 알고 중요 할 수있다. 오래된 Delphi BCL은 문자열을 copy-on-write로 처리합니다. 기본적으로 문자열의 내용이 변경되면 새 인스턴스가 만들어집니다. 그래서 예, 그들은 다소 불변입니다.

+1

... 내가 코드의 두 개의 서로 다른 부분에서 같은 문자열을 생성하는 경우? 그건 쓰기에 복사 아니에요 ... –

+0

BCL? RTL이라고 생각합니다. (당신은 VCL을 의미하지 않았고, VCL은 문자열이 전혀 작동하지 않는 방법을 제어하지 않습니다.) –

+0

@Jorge : 같은 내용으로 문자열을 생성한다고해서 동일한 참조가되는 것은 아닙니다. 그러나 이것은 불변성과 아무 관련이 없습니다. @Rob : BCL은 기본 클래스 라이브러리를 나타내며 RTL은 해당 짐승 중 하나입니다.;) – Lucero

4

델파이 문자열은 변경할 수 없습니다 (try : string1 [2] : = 'a'). 그러나 참조 카운트 및 복사시 복사됩니다. 당신의 해시에 대한

결과는 그들이

등이 저장된다 그러나 해시뿐만 아니라이 저장되는 방법에 대한 문자열의 내용에 따라 방법을 당신이 세부 사항에해야, 명확하지 않다. 그것은 전체 질문을 음소거합니다. 당신이 그것을 더 잘 설명 할 수 없다면.

+0

사실 해시는 일부 정보 (모든 정보)의 요약으로 볼 수 있습니다. 그것은 기본적으로 클래스 내부의 값을 문자열 (해시가 아닌 값)으로 해시로 요약합니다. –