필자가 아는 한, 문자열은 Delphi에서 불변입니다.Delphi 문자열은 변경 불가능합니까?
string1 := 'Hello';
string1 := string1 + " World";
첫 번째 문자열이 파괴되고 새 문자열에 "Hello World"에 대한 참조를 가져 : 나는 종류의 당신이 할 경우 의미 이해합니다.
하지만 코드에서 다른 위치에 동일한 문자열이 있으면 어떻게됩니까?
여러 변수를 식별하기 위해 할당 된 문자열 해시가 있습니다. 예를 들어 "변경"은 해당 속성의 해시 값으로 식별됩니다. 그렇게하면 평등에 대한 "변화"를 확인하는 것이 쉽습니다.
이제는 각 해시가 별도로 계산됩니다 (모든 속성이 고려되지는 않으므로 별도의 인스턴스는 일부 값이 다른 경우에도 동일 할 수 있음).
질문은 어떻게 Delphi가 이러한 문자열을 처리합니까? 해시를 동일한 10 바이트 길이의 문자열로 분리하여 계산하면 무엇을 얻을 수 있습니까? 10 바이트의 두 메모리 블록 또는 동일한 메모리 블록에 대한 두 개의 참조?
설명 : 변경 사항은 데이터베이스에서 읽은 일부 속성으로 구성되며 개별 스레드에 의해 생성됩니다. TChange 클래스에는 일부 값 (전부는 아님)을 기반으로 해시를 계산하여 문자열을 생성하는 GetHash 메서드가 있습니다. 이제 다른 스레드가 변경 사항을 수신하고 이전에 처리 된 변경 사항과 비교하여 동일한 (논리적 인) 변경 사항을 처리하지 않도록해야합니다. 따라서 해시와 별도 인스턴스가 있으므로 서로 다른 두 개의 문자열이 계산됩니다. 문자열에서 128 비트 해시와 같은 것으로 변경하는 것이 실제적인 개선인지 아니면 내 시간을 낭비하는지 확인하려고합니다.
편집 : 델파이 버전은 델파이 7.0
한 번 DLL에서 문자열 조작에 문제가 있었고, 검색 IsMultiThread가 false로 설정되었음을 발견했습니다. System.pas에서 선언되었으며 문자열 참조 계산 및 저장을 수정할 때 사용됩니다. 내 초기화 섹션에서 true로 설정하면 내 문제가 해결되었습니다. –
Stijn - 참조 계산 메커니즘은 멀티 스레드에 안전하도록 버스 잠금 증가 및 감소 지시를 사용합니다. 이것들은 보통 inc와 dec보다 느립니다. IsMultiThread는 Delphi에서 스레드를 생성하여 설정됩니다. 물론 Delphi 외부에서 스레드를 생성하거나 원시 기본 API를 사용하면 알 수 없습니다. –