문제

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top