Есть ли в Delphi какой-либо эквивалент изменчивой переменной C? - PullRequest
13 голосов
/ 24 октября 2008

В C и C ++ переменная может быть помечена как volatile , что означает, что компилятор не будет ее оптимизировать, поскольку она может быть изменена вне объекта объявления. Есть ли эквивалент в программировании на Delphi? Если не ключевое слово, может быть, обойти?

Я думал о том, чтобы использовать Абсолют , но я не был уверен, и это может вызвать другие побочные эффекты.

Ответы [ 5 ]

15 голосов
/ 24 октября 2008

Краткий ответ: нет.

Однако я не знаю ни одной ситуации, в которой консервативный подход компилятора изменит количество операций чтения или записи, если вы будете следовать этому подходу:

При чтении видимого местоположения с несколькими потоками сохраните его значение в локальном, прежде чем выполнять дальнейшие манипуляции; аналогично, ограничьте записи одним назначением.

Компилятор Delphi не выполняет общее исключение подвыражений (CSE) для нелокальных выражений местоположения, когда между выражениями есть вызовы не встроенных методов, так как компилятор не выполняет межпроцедурную оптимизацию и, следовательно, он не будет корректным даже для однопоточного кода.

Итак, вы можете использовать InterlockedExchange () для чтения и записи, чтобы форсировать это; кроме того, это вызовет полный барьер памяти, поэтому процессор также не будет переупорядочивать операции чтения и записи.

8 голосов
/ 10 мая 2016

Согласно Техническому документу Delphi Language для мобильной разработки , мобильные компиляторы Delphi поддерживают атрибут [volatile] с момента их первого появления:

Атрибут volatile используется для пометки полей, которые могут изменяться различными потоками, поэтому генерация кода не оптимизирует копирование значения в регистр или другую временную ячейку памяти.

Вы можете использовать атрибут volatile, чтобы отметить следующие объявления:

  • Переменные (глобальные и локальные)
  • Параметры
  • Поля записи или класса.

Вы не можете использовать атрибут volatile для пометки следующих объявлений:

  • Тип
  • Процедуры, функции или методы
  • Выражения

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

Начиная с Delphi 10.1 Berlin, настольные компиляторы теперь также поддерживают [volatile].

Атрибуты, поддерживаемые всеми компиляторами

Теперь все компиляторы Delphi поддерживают следующие атрибуты:

1 голос
/ 24 октября 2008

Delphi for .Net также не имеет ключевого слова, но платформа .Net имеет функции для него. См Thread.VolatileRead и Thread.VolatileWrite .

1 голос
/ 24 октября 2008

Я не знаю ни одного эквивалента, и при этом я не думаю, что директива absolute поможет вам. absolute позволяет вам иметь две переменные, которые используют один и тот же адрес, но я не думаю, что это помешает компилятору оптимизировать ссылки на эту память.

Я полагаю, вы могли бы использовать указатель и управлять им самостоятельно. Таким образом, что бы компилятор ни делал для оптимизации извлечения значения указателя, он не должен предполагать, что значение, сохраненное по адресу, совпадает с последним разом, когда он его читает, но это чисто предположение.

0 голосов
/ 24 октября 2008

Использовать динамически размещенные указатели?

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

Это должно помешать компилятору использовать регистр для целочисленного значения (но он все равно может использовать его для адреса). Я не уверен, как это можно сравнить с изменчивым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...