Pergunta

C e C ++ uma variável pode ser marcado como volátil , os quais meios do compilador não irá optimizar, porque ela pode ser modificada externo ao objecto de declarar. Existe um equivalente em programação Delphi? Se não for uma palavra-chave, talvez um trabalho em torno?

O meu pensamento era usar Absolute , mas eu não tinha certeza, e que podem introduzir outros efeitos colaterais.

Foi útil?

Solução

resposta curta: Não.

No entanto, eu não tenho conhecimento de qualquer situação em que a abordagem conservadora do compilador irá alterar o número de leituras ou gravações se você seguir esta abordagem:

Ao ler um local visível cruz-thread, salvar o seu valor a um local antes de fazer qualquer manipulação adicional; Da mesma forma, restringir gravações para uma única tarefa.

O compilador Delphi não executa eliminação subexpressão comum (CSE) em expressões localização não locais quando há chamadas para métodos não-inline entre as expressões, como o compilador não fazer otimização Interprocedimental e, portanto, não seria correto mesmo para código single-threaded.

Assim, você pode querer usar InterlockedExchange () para fazer a sua lê e escreve para forçar isso; Além disso, isso fará com que uma barreira de memória cheia, por isso, o processador não irá reordenar lê e escreve qualquer um.

Outras dicas

De acordo com o A linguagem Delphi para mobile Development whitepaper, compiladores móveis da Delphi têm apoiado um [volatile] atributo desde que foram introduzidas pela primeira vez:

O atributo volatile é usado para campos de marca que estão sujeitos a alterações por diferentes tópicos, de modo que a geração de código não otimiza copiar o valor num registo ou outro local de memória temporária.

Você pode usar o atributo volatile para marcar as seguintes declarações:

  • As variáveis ??(globais e locais)
  • Parâmetros
  • Os campos de um registro ou uma classe.

Você não pode usar o atributo volátil para marcar as seguintes declarações:

  • Digite
  • Procedimentos, funções ou métodos
  • Expressões

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

A partir do Delphi 10.1 Berlim, os compiladores desktop agora apoiar [volatile] também.

atributos suportados por todos os compiladores

Agora, todos os compiladores Delphi suporta os seguintes atributos:

Eu não sei de qualquer equivalente, nem acho que o absoluta directiva irá ajudá-lo. absoluta permite que você tenha duas variáveis ??que usam o mesmo endereço, mas eu não acho que vai impedir que o compilador de otimização de referências a essa memória.

Eu imagino que você poderia usar um ponteiro e geri-lo você mesmo. Dessa forma, qualquer que seja o compilador faz, tanto quanto otimizar retrival do valor ponteiro, ele não deve assumir o valor armazenado no endereço é o mesmo da última vez que lê-lo, mas isso é pura especulação.

Delphi para .NET não tem a palavra-chave também, mas a plataforma .Net tem util funções para ele. Consulte Thread.VolatileRead e Thread.VolatileWrite .

Use ponteiros alocados dinamicamente?

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

Isso deve manter o compilador de usar um registro para o valor inteiro (mas ainda pode usar um para o endereço). Não estou certo de como isso se compara a volátil, apesar de tudo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top