왜 델파이에서 자아 할당 할 수 있습니까?
-
03-07-2019 - |
문제
GUI 응용 프로그램 의이 코드는 다음과 같습니다.
procedure TForm1.Button1Click(Sender: TObject);
begin
Self := TForm1.Create(Owner);
end;
(델파이 6 및 2009로 테스트)
- 자기 쓰기가 가능한 이유는 무엇입니까?
- 어떤 상황에서 이것이 유용 할 수 있습니까?
편집하다:
- 델파이 프리즘에서도 가능합니까? (예라고 생각합니다 여기)
업데이트 : 자체 할당을 사용하는 델파이 애플리케이션/라이브러리 :
해결책
그것은 가능한 한 나쁘지 않습니다. 방금 Delphi 2009에서 테스트했는데 자체 매개 변수가 사용하지 않는 것 같습니다. Const 당신이 그것을 암시하는 것처럼 보이는 의미론, 그것은 또한 사용하지 않습니다. var 의미론, 따라서 발신자가 객체에 대한 참조를 실제로 잃지 않고 원하는 모든 것을 변경할 수 있습니다. 그것은 매우 나쁜 일입니다.
이유에 관해서는 두 가지 답변 중 하나입니다. 간단한 감독 또는 Marco가 제안한 것 : 자신을 var 매개 변수.
다른 팁
const 또는 var 매개 변수로 전달할 수 있습니까?
시스템은 다음의 왼쪽에 자체가 없기 때문에 인공물 일 수 있습니다.
자기 자신에게 할당하는 것은 비논리적이고 쓸모가 없어서이 '기능'은 아마도 감독 일 것입니다. 그리고 할당 가능한 상수와 마찬가지로 그러한 문제를 해결하기가 항상 쉬운 것은 아닙니다.
간단한 조언은 다음과 같습니다.
실제로, "self"는 힙에 객체를 가리키는 저장 주소를 스택의 장소에 대한 이름을 언급하는 것입니다. 이 변수에 대한 읽기 전용을 강요하는 것이 가능합니다. 분명히 디자이너는하지 않기로 결정했습니다. 나는 결정이 임의적이라고 믿는다.
이것이 유용한 경우를 볼 수 없습니다. 그것은 단지 스택의 값을 바꾸는 것뿐입니다. 또한 인스턴스 멤버를 참조하는 코드의 동작이 컴파일러 버전에서 일관성이 될 것이라는 보장이 없기 때문에이 값을 변경하는 것은 위험 할 수 있습니다.
업데이트 : 응답으로 PatrickvL
논평
'가변' "자아"는 스택에 있지 않습니다 (내 지식으로는 결코 그렇지 않습니다). 대신 객체에 대한 호출이 이루어지기 직전에 값이 레지스터 (EAX 정확한 정확한)에 넣습니다. -
아니, 자아는 기억에 실제 주소를 가지고 있습니다. 이 코드를 시도하여 직접 확인하십시오.
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(Integer(@Self)));
end;
procedure TForm1.Button2Click(Sender: TObject);
var
newform: TForm;
p: ^Integer;
begin
Self.Caption := 'TheOriginal';
newform := TForm.Create(nil);
try
newform.Caption := 'TheNewOne';
// The following two lines is, technically, the same as
// Self := newform;
p := Pointer(@Self);
p^ := Integer(newform);
ShowMessage(Self.Caption); // This will show 'TheNewOne' instead of 'TheOriginal'
finally
Self.Free; // Relax, this will free TheNewOne rather than TheOriginal
end;
end;
때로는 테마를 최적화 할 때 (어셈블리에 의지하지 않고) 방법을 최적화하려면 '자기'가 '무료'변수로 사용될 수 있습니다. 스택 사용과 스택 사용의 차이를 의미 할 수 있습니다. 레지스터 사용.
물론, 스택의 내용은 아마도 CPU 캐시에 이미 존재하므로 액세스하기가 빠르지 만 레지스터는 여전히 더 빠릅니다.
Sidenote로서 : 나는 여전히 Amiga 's Motorola 68000에서 프로그래밍 중이고 16 개의 데이터와 16 개의 주소 레지스터의 사치품을 가지고있는 날을 아직 놓치고 있습니다 .... 세계가 제한된 4 개의 레지스터를 사용하여 선택했다고 믿을 수 없습니다. 80x86 프로세서 라인!
그리고 마지막으로, 나는 델파이의 옵티마이저마가 아니기 때문에 때때로 자기를 사용하기로 선택합니다. 최적화 사실, 사실. (예를 들어 다양한 LLVM 최적화기에서 찾을 수있는 속임수와 비교할 때 적어도 Pales.) IMHO 및 YMMV.