문제

C 및 C++에서 변수로 표시할 수 있습니다 휘발성, 즉,컴파일러는 것을 최적화하지 않기 때문에 그것이 수정될 수 있 외부를 선언한 객체입니다.이 있는 이와 동등한 델파이 프로그래밍이 가능한가요?하지 않을 경우 키워드로,어쩌면 주위의 작?

내 생각하는 사용 절대, 지만,저는 확실하지 않았다,그리고할 수 있습을 소개하는 다른 부작용이 있습니다.

도움이 되었습니까?

해결책

짧은 대답 : 아니요.

그러나이 접근 방식을 따르는 경우 컴파일러의 보수적 인 접근 방식이 읽기 수를 변경하거나 쓰는 상황을 알지 못합니다.

크로스 스레드 가시적 위치를 읽을 때 더 이상의 조작을하기 전에 로컬에 값을 저장하십시오. 마찬가지로, 제한은 단일 과제에 기록됩니다.

델파이 컴파일러는 표현식 사이에 비 인식 된 메소드에 대한 호출이있을 때 비 국한적 위치 표현식에서 공통 서브 표현 제거 (CSE)를 수행하지 않으므로 컴파일러가 문법 최적화를 수행하지 않으므로 단일에도 맞지 않기 때문입니다. -스레드 코드.

따라서 interlockedExchange ()를 사용하여 읽기를하고 글을 강제로 작성할 수 있습니다. 또한 이로 인해 완전한 메모리 장벽이 발생하므로 프로세서가 다시 읽고 쓰지 않습니다.

다른 팁

에 따르면 모바일 개발을위한 델파이 언어 백서, Delphi의 모바일 컴파일러는 지원했습니다 [volatile] 처음 소개 된 이후 속성 :

그만큼 volatile 속성은 다른 스레드에 의해 변경 될 수있는 필드를 표시하는 데 사용되므로 코드 생성은 레지스터 또는 다른 임시 메모리 위치에서 값을 복사하는 것을 최적화하지 않도록합니다.

당신은 사용할 수 있습니다 volatile 다음 선언을 표시하는 속성 :

  • 변수 (글로벌 및 로컬)
  • 매개 변수
  • 레코드 또는 클래스의 필드.

휘발성 속성을 사용하여 다음 선언을 표시 할 수 없습니다.

  • 유형
  • 절차, 기능 또는 방법
  • 표현

type
  TMyClass = class
  private
    [volatile] FMyVariable: TMyType;
  end;

Delphi 10.1 Berlin에서 시작하여 데스크탑 컴파일러가 지원합니다. [volatile] 또한.

모든 컴파일러가 지원하는 속성

이제 모든 델파이 컴파일러는 다음 속성을 지원합니다.

몰의 동의한 것도 아니요,제가 생각하는 절대 지시어 당신을 도움이 될 것입니다. 절대 할 수 있는 두 개의 변수를 사용하는 동일한 주소지만,나는 생각하지 않는 것이지에서 컴파일러 최적화에 대한 참조는 메모리.

내가 상상할 수 있다 포인터를 사용하여하고 관리합니다.는 방법이 무엇이든 컴파일러는 만큼 최적화검색의 포인터 값을,그것은 가정에 저장된 값 주소와 같이 마지막 시간에 그것은,그것을 읽지만 이것은 순수한 추측했습니다.

.NET 용 Delphi에는 키워드가 없지만 .NET 플랫폼에는 UTIL 기능이 있습니다. 보다 thread.volatileread 그리고 thread.volatilewrite.

동적으로 할당 된 포인터를 사용 하시겠습니까?

var
  MyVarPtr: ^integer;
begin
  New(MyVarPtr);
  MyVarPtr^ := 5;
...

이렇게하면 컴파일러가 정수 값에 대한 레지스터를 사용하지 않도록해야합니다 (그러나 주소에 여전히 사용될 수 있습니다). 그래도 그것이 휘발성과 어떻게 비교되는지 잘 모르겠습니다.

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