Does Delphi tem qualquer equivalente a variável volátil C?
-
04-07-2019 - |
Pergunta
C e C ++ uma variável pode ser marcado como
O meu pensamento era usar Absolute , mas eu não tinha certeza, e que podem introduzir outros efeitos colaterais.
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 ??strong> directiva irá ajudá-lo. absoluta ??strong> 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.